问题:
如何从该类的实例生成该类的新实例?
我发现了什么:
考虑下一个类及其实例:
// Create a new class
var Foo = function Foo () {
console.log('New instance of FOO!');
};
Foo.prototype.generate = function(first_argument) {
this.arr = [1,2,3,4,5];
};
var foo = new Foo();
foo.generate();
console.log(foo.arr); // [1,2,3,4,5]
请注意,这foo
是 fo 的实例Foo
,我将在示例中使用此实例。
对象.create
使用 Object.create 我可以生成 foo 实例的新副本,但它们将共享状态数据:
var bar = Object.create(foo);
console.log(bar.arr); // [1,2,3,4,5]
bar.arr.push(6);
console.log(foo.arr); // [1,2,3,4,5,6]
console.log(bar.arr); // [1,2,3,4,5,6]
如果某些逻辑在构造函数中,则不会调用它。
原型继承
这类似于对象创建,但它调用构造函数。它仍然有相同的状态数据问题:
var Bar = function () {
foo.constructor.call(this);
};
Bar.prototype = foo;
var bar = new Bar();
console.log(bar.arr); // [1,2,3,4,5]
bar.arr.push(6);
console.log(foo.arr); // [1,2,3,4,5,6]
console.log(bar.arr); // [1,2,3,4,5,6]
火狐原型
这是我真正想做的一个例子,但它只适用于 Firefox:
// Create Bar class from foo
var Bar = foo.constructor;
Bar.prototype = foo.__proto__; // Firefox only
在这里,我有类 Bar,它是类 Foo 的副本,我可以生成新实例。
var bar = new Bar();
console.log(bar.arr); // undefined
bar.generate();
console.log(bar.arr); // [1,2,3,4,5]
有没有其他方法可以实现适用于所有浏览器的相同目标?