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@AtulAgrawal
Object.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);
    }
 }