2015-07-19 73 views
2

我在JavaScript中实现了从父类继承的函数。它适用于这种风格的代码。在对象原型中定义继承

function Foo(){} 

Foo.prototype = { 
    constructor: Foo, 
    name: 'foo', 
    tostring: function() 
    { 
     return this.name; 
    } 
}; 

function Bar(){} 

Bar.prototype = new Foo(); 
Bar.prototype.name = 'bar'; 

var b = new Bar(); 
console.log(b.tostring()); // says 'bar' 

这没关系。但是我在Bar中有很多属性,我不想每次重复Bar.prototype.someProp,所以我使用了简写版本,并且它不是继承。

function Bar(){} 
Bar.prototype = new Foo(); 
Bar.prototype = { 
    constructor: Bar, 
    name: 'bar' 
}; 

console.log(b.tostring()); // doesn't work since the method doesn't exist 

我假设Bar.prototype被本地对象的Javascript覆盖。我如何继承使用简写Bar.prototype = {}并避免重复?

+0

你为什么要修改的原型,而不是对象只是定义函数? – David

+2

请仔细阐述,@David – Hawk

+0

请参阅:http://google.github.io/styleguide/javascriptguide.xml?showone=Method_and_property_definitions#Method_and_property_definitions 为了调试和语言的安全性,最好不要触摸通常是一个物体的原型。 – David

回答

2

如果您使用...

Bar.prototype = { 
    constructor: Bar, 
    name: 'bar' 
}; 

...你在Bar原型覆盖了一切,有一个新的对象替换它。尝试单独设置Bar.prototype.constructor = xxxBar.prototype.name = 'bar'

你可以定义一个辅助函数,以减少重复,但它可能是不值得的,如果你只需要一次:

function extend_with(obj, kv) { 
    for (var k in kv) { 
     obj[k] = kv[k]; 
    } 
} 

extend_with(Bar.prototype, { 
    constructor: Bar, 
    name: 'bar' 
}); 
+0

如果我单独使用它,将会有太多的重复我想避免。 – Hawk

+1

没关系 - 你不能直接用对象设置原型,它会覆盖原型中已经存在的所有东西。在一些JavaScript库中有辅助函数可以单独复制属性(例如Prototype.js中的Object.extend)。为此,ECMAScript 6将具有'Object.assign':https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign – thomasfuchs

+0

@thomasfuchs对不起,我刚添加了另一个变体到你的答案。它对你来说看起来合理吗? – melpomene