我来为你详细讲解“详解js中的原型,原型对象,原型链”的完整攻略。
1. 原型
在 Javascript 中,每个对象都有一个原型对象(prototype)。原型是一个简单的对象,它是由对象创建函数(Object、Array、Function 等)创建的。
我们来看一个简单的示例:
function Person(name, age) {
this.name = name;
this.age = age;
}
const person = new Person('Jack', 20);
console.log(person);
输出结果:
Person { name: 'Jack', age: 20 }
在这个示例中,我们创建了一个构造函数 Person
,并通过 new
关键字创建了一个实例对象 person
。实例对象 person
通过该构造函数 Person
的原型进行了继承。在 JavaScript 中,每个函数都有一个 prototype
属性,它指向的就是这个实例对象的原型。
console.log(Person.prototype);
输出结果:
Person {}
这里的 Person.prototype
就是 person
对象的原型。可以发现原型是一个普通的空对象。如果要向原型中添加属性或方法,可以直接在 Person.prototype
对象中定义和修改,例如:
Person.prototype.sayName = function() {
console.log(this.name);
};
person.sayName(); // 输出 Jack
2. 原型对象
JavaScript 中的函数都是对象,因此它们也有一个原型对象。例如,通过函数对象 Function.prototype
对象添加的方法和属性,可以在所有函数中调用。
在前面的示例中,我们已经使用过构造函数的原型对象 Person.prototype
,在这里再来加深一下印象。比如我们现在想添加一个 greet
方法,可以这样写:
Person.prototype.greet = function() {
console.log('Hello, ' + this.name);
};
3. 原型链
所有的对象都有原型,通过原型链,可以访问到每一个对象的最终原型。原型链的核心就是每个对象都保持着一个内部链接到它自己的原型对象,这个链接成为 [[Prototype]]
属性。
在前面的示例中,我们使用了 Person
构造函数创建的实例对象 person
通过原型链接到 Person.prototype
原型对象。Person.prototype
又连接到一个更基本的对象 Object.prototype
。
console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true
通过原型链,person
实例对象继承了 Person
构造函数的原型对象 Person.prototype
中的属性和方法,同时也继承了 Person.prototype
的 [[Prototype]]
属性,这个属性指向 Object.prototype
。因此,实例对象 person
可以调用 Object.prototype
中定义的方法。
比如:
console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('toString')); // false
console.log(Object.prototype.hasOwnProperty('toString')); // true
在这里,我们分别使用 hasOwnProperty
方法来判断 person
实例对象是否包含 name
属性,和 toString
方法,同时也调用了 Object.prototype
中定义的 hasOwnProperty
方法去确认这些属性和方法的继承关系。
综上所述,原型、原型对象和原型链是 JavaScript 中很重要的概念,了解它们的关系可以大大提高代码的可维护性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解js中的原型,原型对象,原型链 - Python技术站