【发布时间】:2019-10-16 06:12:20
【问题描述】:
我正试图围绕原型展开思考,并想知道 原型到底是什么。许多困惑源于不理解用于描述的元语言 原型。
这是我所知道的:
当我们创建一个带有属性的命名构造函数时,该构造函数体内的属性被该构造函数创建的对象实例继承。在这里,我从名为 Person 的构造函数创建了一个名为 person001 的实例。
function Person(firstName,lastName) {
this.firstName = firstName;
this.lastName = lastName
}
undefined
var person001 = new Person("John","Doe");
当我在控制台中查看对象实例并跟踪原型链时,我发现它位于 2 个不同的地方。它是 dunder proto 对象的构造函数对象...
Person {firstName: "John", lastName: "Doe"}
firstName: "John"
lastName: "Doe"
__proto__:
constructor: ƒ Person(firstName,lastName)
__proto__: Object
以及同一个构造函数对象内部的原型对象的属性。
Person {firstName: "John", lastName: "Doe"}
firstName: "John"
lastName: "Doe"
__proto__:
constructor: ƒ Person(firstName,lastName)
arguments: null
caller: null
length: 2
name: "Person"
prototype:
constructor: ƒ Person(firstName,lastName)
__proto__: Object
__proto__: ƒ ()
[[FunctionLocation]]: script.js:76
[[Scopes]]: Scopes[1]
__proto__: Object
当我使用命名构造函数的 .prototype 属性添加属性时,我将该属性添加到原型对象,而不是构造函数。添加的属性将位于原型属性对象中的构造函数旁边。这里我使用构造函数 Person 的原型属性添加了一个名为 age 的属性。
Person.prototype.age = 0;
既然我已经添加了一个额外的属性,那么原型到底是什么?
当我在对象实例 person001 上运行 Object.getPrototypeOf 方法时,它会返回在我看来类似于原型对象的内容。它有 3 个属性——一个构造函数、我添加的属性和隐式 dunder proto 对象。
Object.getPrototypeOf(person001);
{age: 0, constructor: ƒ}
age: 0
constructor: ƒ Person(firstName,lastName)
__proto__: Object
那么原型是什么?是原型对象{构造函数,附加属性}吗?还是只是原型对象的构造函数?
提前感谢您的帮助。
【问题讨论】:
标签: javascript oop prototype prototype-chain