2016-12-31 141 views
0

我有这样的对象:如何创建从父对象继承的对象?

var A = { 
    headers: { 
    'a property' : 'a value' 
    } 
}; 

我如何创建这样另一个对象?

我不想键入整个父对象?我的新对象应该包含父对象,所以当我的变量A,B和C应该产生不同的结果。

var B = { 
    headers: { 
    'a property' : 'a value', 
    'b property' : 'b value' 
    } 
}; 

var C = { 
    headers: { 
    'a property' : 'a value', 
    'b property' : 'b value' 
    }, 
    other: { 
    other2: { 
     'other2 property' : 'other2 property' 
    } 
    } 
}; 
+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create – Teemu

+0

@Teemu有点混淆如何使用它,可能是你可以回答它。 –

+0

如果在扩展它时需要对上一个对象进行深度克隆,则可以使用针对[此问题]发布的许多深度合并解决方案之一(http://stackoverflow.com/questions/171251/how-can-i -merge-properties-of-two-javascript-objects-dynamically/41407737#41407737),例如函数I [posted on](http://stackoverflow.com/a/41407737/5459839)。 – trincot

回答

0

如果您的问题与值已经扩展对象BA,您可以使用JavaScript对象的方法Object.assign做象下面这样:

var A = { 
    headers: { 
    'a property' : 'a value' 
    } 
}; 


var B = Object.assign(A); 
B.headers['b property'] = 'b value'; 

这将复制的内容来源这里对象即A.headersB.headers导致如下:

{ 
    headers: { 
    'a property' : 'a value', 
    'b property' : 'b value' 
    } 
}; 
+0

请注意此代码如何将'b属性'添加到'A.headers' – trincot

2

您可以ü se创建功能:

var B = Object.create(A); 
B.headers['b property'] = 'b value'; 

var C = Object.create(B); 
C.others = { 
    other2: { 
     'other2 property' : 'other2 property' 
    } 
    } 
+0

应该是'var C = Object.create(B)'no? –

+0

是的,谢谢你的评论。 – Saeed

+0

请注意,B和C与A共享'headers'对象。如果您通过一个来更改它们,则更改也会在另一个中可见。注意这段代码如何将'b property'添加到'A.headers'。 – trincot

0

我总是在我的项目中使用Simple JavaScript Inheritance by John Resig。这是继承的简单而优雅的解决方案。

通过使用上述解决方案,您可以按如下方式定义您的类。你所需要做的就是扩展这些类。

var Person = Class.extend({ 
    init: function(isDancing) { 
     this.dancing = isDancing; 
    } 
}); 

var Ninja = Person.extend({ 
    init: function() { 
     this._super(false); // => Overrides the superior constructor 
    } 
}); 

var p = new Person(true); 
p.dancing; // => true 

var n = new Ninja(); 
n.dancing; // => false 

这也有因为将是您的所有类的init方法,所以你要知道哪里来引导的事情,以及如何覆盖事情正确。