假设我有一个对象,并用它创建另一个对象:
var person = {
name: "Lee",
age: "12",
others: {}
}
var per1 = Object.create(person);
var per2 = Object.create(person);
per2.name = "Mike";
per2.others.hello = "world";
console.log(per1); // Object {name: "Lee", age: "12", obj: Object}
console.log(per2); // Object {name: "Mike", name: "Lee", age: "12", obj: Object}
console.log(per1.others.hello, per2.others.hello) // world world
我的困惑是:
为什么
per2
有双名?如果另一个来自原型,我试着per2.prototype.name = "mike"
告诉我原型是未定义的,但那怎么可能是未定义的呢?的工作Object.create
不是Creates a new object with the specified prototype object and properties.
MDN为什么会在两者之间
others
共享但名称不共享per1
per2
另一个困惑是假设我有一个功能:
function Person(name) {
this.name = name
}
Person.prototype.say = function () {
console.log("hello")
}
但是从函数创建另一个对象,没有函数的原型:
var obj = Object.create(Person);
console.log(obj) // Function {}:
console.log(obj.prototype) // undefined
为什么原型未定义?不是自己Object.create
创造的吗?
更新:
正如@bfavaretto 所说,只有构造函数可以拥有prototype
,并且Object.getPrototypeOf
可以显示一个对象的原型。所以我尝试了这两种方法来获取per1
的原型:
console.log(per1.constructor.prototype) // Object{}
console.log(Object.getPrototypeOf(per1)) //Object {name: "Lee", age: "12", obj: Object}
他们是不同的,为什么?