我创建了一个如下对象
var lassie = {
name: 'Lassie',
breed: 'Collie',
speak: function () {
return 'Woof! Woof!'; }
};
我使用javascript的Object.create方法创建另一个对象
var obj = Object.create(lassie);
现在当我控制 obj 时,它给了我一个空白对象。 但当我控制 obj.speak()时,它给了我' Woof! Woof!' 。
有人可以解释一下原因吗?
答案 0 :(得分:1)
基本上Object.create
将创建一个没有自己属性的对象。这意味着传递的对象自己的属性将被指定为新创建的对象的原型属性,并将返回。
从Object.create()
,
var obj = {a:10};
var obj1 = Object.create(obj);
console.log(obj1); // {... __proto__ : {a : 10 ...}}
如果要将传递的对象的自己的propties(可枚举)复制到另一个对象,那么您必须Object.assign(obj)
作为传递第二个参数作为Object.create
的属性描述符属性的替代方法
答案 1 :(得分:1)
var obj = Object.create(lassie);
通过这样做,你创建了一个新对象,它继承了lassie的属性。
如果你这样做
obj.name; //this prints "Lassie" too.
答案 2 :(得分:1)
答案 3 :(得分:1)
var lassie = {
name: 'Lassie',
breed: 'Collie',
speak: function () {
return 'Woof! Woof!'; }
};
var obj = Object.create(lassie);
现在你关注的是现在你控制obj时它给了我一个空白对象。但是当你安慰obj.speak()
时,它会给你“Woof!”汪&#39!; 强>
实际上 obj 现在具有 lassie 的所有属性,但这些属性不是 obj 自己的属性。
在这里,您将看到obj的所有属性:
for(var a in obj){
console.log(a);
}
在这里你会看到obj自己的财产:
for(var b in obj){
if (obj.hasOwnProperty(b)) {
console.log(b);
}
}
这实际上是因为当我们使用var target = Object.create(obj);
时
然后将所有属性作为原型属性添加到目标。