1

是否可以结合以下

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

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

有了这个

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

并维护原型继承链

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

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

4

4 回答 4

1

我个人最喜欢的方法是获取 underscore.js 库。它有一个非常好的方法,称为扩展,可以将属性附加到对象上。所以,我可以这样做:

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

somethingElse.prototype = new something();

_.extend(somethingElse.prototype, {
    someFunction: function () { },
    someOtherFunction: function () { }
});
于 2013-02-15T21:03:06.457 回答
0

您可以使用Object.defineProperties,但它实际上更冗长,并且在旧版浏览器中不支持:

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

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

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

这将允许您这样做:

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

我通常会建议不要这样做,因为修改本机对象的原型可能会很冒险。

于 2013-02-15T21:19:49.203 回答
0

不同的是,在第二个版本中,somethingElse实例不会something从其原型链继承任何东西。不过,考虑到您的示例代码,这不会有任何区别。

于 2013-02-15T21:02:04.070 回答
0

嗯,它们确实是一样的。

foo = {}
foo.bar = baz

是相同的

foo = {
    bar: baz
}

这是一个品味问题。

顺便说一句:用大写首字母命名构造函数(任何用 new 调用的东西)被认为是更好的风格,以将其与常规函数区分开来,因为混淆它们可能会做非常糟糕的事情。

于 2013-02-15T21:03:00.450 回答