JavaScript';s Object.create方法
我创建了一个对象,如下所示JavaScript';s Object.create方法,javascript,prototype,Javascript,Prototype,我创建了一个对象,如下所示 var lassie = { name: 'Lassie', breed: 'Collie', speak: function () { return 'Woof! Woof!'; } }; 我使用javascript的object.create方法创建另一个对象 var obj = Object.create(lassie); 现在,当我控制台obj时,它会给我一个空白对象。 但是当我安慰对象说话时,它给了我呜呜声!汪 有人能解释一下原因吗?基本上是
var lassie = {
name: 'Lassie',
breed: 'Collie',
speak: function () {
return 'Woof! Woof!'; }
};
我使用javascript的object.create方法创建另一个对象
var obj = Object.create(lassie);
现在,当我控制台obj时,它会给我一个空白对象。
但是当我安慰对象说话时,它给了我呜呜声!汪
有人能解释一下原因吗?基本上是
对象。create
将创建一个没有自己属性的对象。这意味着传递的对象自身的属性将被指定为新创建对象的原型属性,并将被返回
从object.create()
返回的对象的示例结构
如果要将传递对象的自身属性(可枚举)复制到另一个对象,则必须可以object.assign(obj)
作为传递第二个参数作为对象的属性描述符属性的替代方法。create
var obj = Object.create(lassie);
通过这样做,您已经创建了一个新对象,该对象继承了lassie的属性
如果你这样做
obj.name; //this prints "Lassie" too.
将
lassie
作为第一个参数传递给obj的prototype
设置为lassie
;迭代lassie
返回属性作为第二个参数
var lassie={
名字:'小姐',
品种:'牧羊犬',
讲:函数(){
返回“汪汪!汪汪!”;
}
};
var obj=Object.create(lassie,(function(){
var_obj={};
for(lassie中的var道具){
_obj[prop]={
值:lassie[道具],
可写:对,
可枚举:正确,
可配置:true
}
}
返回对象
}()));
警报(obj.speak())
现在你关心的是现在当你控制台obj时,它给了我一个空白对象。但是当你操控obj.speak()
时,它会给你“呜呜”声!汪强>
实际上,这里的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)代码>
然后将所有属性作为原型属性添加到目标 “如果要创建与传递对象具有相同结构的对象,则必须使用object.assign(obj)”?@guest271314我的意思是,如果希望将传递对象的自身属性复制到较新的对象。然后他必须使用分配。这也是可枚举属性。Object.create()
可用于传递可枚举属性properties@guest271314但是如果我们使用create
,那么自己的属性将转换为原型属性。同时,assign
会将自身属性复制为返回对象的自身属性。短语“you have use”会忽略其他可能的解决方案?注意,您也可以将null
作为第一个参数传递给对象。create()
并且仍然将不可操作的属性作为第二个参数@AtulAgrawal传递,这取决于预期的结果。可以将原始对象、null
或对象文本{}
作为第一个参数传递给对象。create()
但是对于同样的工作,为什么我需要使用Object.create,因为我可以直接实现同样的事情,而不需要指出我的问题是obj现在是对空对象的引用,然后它如何打印对象的属性lassie@AtulAgrawalObject.create()
的第一个参数设置所创建对象的prototype
。当您通过lassie
时,lassie
被设置为obj
的prototype
。请参阅“propertiesObject可选。如果已指定但未定义,则其可枚举自身属性(即在其自身上定义的属性,而不是其原型链上的可枚举属性)的对象将指定要添加到新创建对象的属性描述符,以及相应的属性名称。”但是为什么obj.prototype是空的您必须使用obj.\uuu proto\uu访问原型属性。
for(var a in obj){
console.log(a);
}
for(var b in obj){
if (obj.hasOwnProperty(b)) {
console.log(b);
}
}