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



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

例如

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原型上的属性才会被复制?

有更好的方法吗?

一般来说,尝试将其他语言的模式模仿到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() {}

你可以做Object.create(bar),而不是做new bar(),正如一些评论者指出的那样,但这在IE8和以下版本中不支持。两者之间唯一的功能区别是new bar()将执行bar的构造函数,而后者不会,这对您可能有影响,也可能没有影响。Object.create()在技术上是更正确的方式,但可能是一个交易破坏者,除非你愿意失去IE8或使用垫片。

这是另一个模式,我的首选,使用合成代替

// 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();
}

最新更新