结合javascript原型样式

时间:2013-02-15 20:59:43

标签: javascript prototype-chain

是否可以合并以下

function something() {}
function somethingElse() {}

somethingElse.prototype = new something();
somethingElse.prototype.someFunction = function() {}
...

用这个

somethingElse.prototype = {
    someFunction: function() {},
    ...
}

并维护原型继承链

我猜这纯粹是化妆品。我想在{}中定义所有函数,而不是使用大量的...... prototype ... = ...

我见过很多,但从来没有把它们聚集在一起。

4 个答案:

答案 0 :(得分:1)

我个人最喜欢的方法是获取underscore.js库。它有一个非常好的方法叫做extend来将属性粘贴到对象上。所以,我可以这样做:

function something() {}
function somethingElse() {}

somethingElse.prototype = new something();

_.extend(somethingElse.prototype, {
    someFunction: function () { },
    someOtherFunction: function () { }
});

答案 1 :(得分:0)

不同之处在于,在第二个版本中,somethingElse个实例不会继承something及其原型链中的任何内容。考虑到您的示例代码,但这并没有任何区别。

答案 2 :(得分:0)

嗯,他们的确非常相似。

foo = {}
foo.bar = baz

相同
foo = {
    bar: baz
}

这是一个品味问题。

BTW:用一个大写字母来命名构造函数(用new调用的任何东西)被认为是更好的样式,以区别于常规函数,因为混淆它们可能会做很糟糕的事情。

答案 3 :(得分:0)

您可以使用Object.defineProperties,但它实际上更详细,并且在旧版浏览器中没有支持:

Object.defineProperties(somethingElse.prototype,{
    someOtherFunction: {
        value:function() {...}
    },
    ...
});

或者,您可以向Object原型添加一个基本的extend方法:

Object.prototype.extend = function(obj){
    for(var p in obj)this[p] = obj[p];
};

这将允许您这样做:

somethingElse.prototype.extend({
    A:function(){'a'},
    B:function(){'b'}
});

我一般会建议不要这样做,因为修改原生对象的原型可能会有点冒险。