gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:34:41 25 4
gpt4 key购买 nike

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

一个例子是

function A() {

};

A.prototype.B = function() {

};

A.prototype.C = function() {

};

A.prototype.D = function() {

};

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

我试过的是这个;

// 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 原型(prototype)上的属性会被复制?

有更好的方法吗?

最佳答案

一般来说,尝试将其他语言的模式模拟到 Javascript 中并不总是明智的。 Javascript 使用原型(prototype)继承,而不是标准的 OO 继承(例如您在 Java 中所做的)。是的,您可以将方法从一个原型(prototype)复制到另一个原型(prototype),但这并不总是可取的,因为您实际上将内部对象的封装从水中吹了出来。如果您确实想要复制方法,只需将一个对象原型(prototype)设置为与另一个对象原型(prototype)相等即可。

这是一种继承模式

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

关于javascript - 这是将一个对象原型(prototype)复制到另一个对象原型(prototype)的安全方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com