这是将一个对象原型复制到另一个原型的安全方法吗?

时间:2013-05-15 00:49:38

标签: javascript prototype

假设我有一个具有我手动设置的原型属性的对象。

一个例子是

function A() {

};

A.prototype.B = function() {

};

A.prototype.C = function() {

};

A.prototype.D = function() {

};

如何使用A的原型扩展另一个对象?

我试过的是这个;

// obj = extend to object
// obj2 inherit from object

for (var prop in obj2.prototype) {
            if (obj2.prototype.hasOwnProperty(prop)) {
                obj.prototype[prop] = obj2.prototype[prop];
            }
        }

使用obj2.hasOwnProperty(prop)是否确保只复制A原型上的属性?

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

通常,尝试将其他语言的模式模拟为Javascript并不总是可取的。 Javascript使用原型继承,而不是标准的OO继承(例如你在Java中所做的)。是的,你可以将方法从一个原型复制到另一个原型,但并不总是可取的,因为你真的把内部物体封装在水中。如果您确实想要复制方法,只需将一个对象原型设置为等于另一个即可。

这是继承的一种模式

// object we want to inherit from
function bar() {}
bar.prototype.original = function() {}

// object which will inherit bar
function foo() {}
// first map prototypes
foo.prototype = new bar();

// add additional methods to foo
foo.prototype.somethingElse = function() {}

正如一些评论者指出的那样,您可以new bar()执行Object.create(bar)而不是bar,但IE8及以下版本不支持此功能。两者之间唯一的功能区别是新的bar()将执行Object.create()的构造函数,而后者则不会,这对您来说可能或不重要。 // object we want to inherit from function bar() {} bar.prototype.original = function() {} function foo() { this.bar = new bar(); } foo.prototype.somethingElse = function() { // foo has a bar, but isn't a bar this.bar.original(); } 在技术上是更正确的方法,但除非你愿意失去IE8或使用垫片,否则可能是一个交易破坏者。

这是另一种模式,我的首选,使用构图

{{1}}