您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

原型为数组的Javascript对象成员将由所有类实例共享

原型为数组的Javascript对象成员将由所有类实例共享

对象的原型只是一个对象。原型属性在从该对象继承的所有对象之间共享。如果您创建“类”的新实例(JS中始终不存在类),即从原型继承的对象,则不会复制属性

它仅对如何使用这些继承的属性有所不同:

function Foo() {}

Foo.prototype = {
    array: [],
    func: function() {}
}

a = new Foo();
b = new Foo();

a.array.push('bar');
console.log(b.array); // prints ["bar"]

b.func.bar = 'baz';
console.log(a.func.bar); // prints baz

在所有这些情况下,您始终使用相同的对象。

但是,如果您为对象的属性分配值,则该属性将在对象本身而非其原型上设置/创建,因此不会共享:

console.log(a.hasOwnProperty('array')); // prints false
console.log(a.array); // prints ["bar"]
a.array = ['foo'];
console.log(a.hasOwnProperty('array')); // prints true
console.log(a.array); // prints ["foo"]
console.log(b.array); // prints ["bar"]

如果要为每个实例创建自己的数组,则必须在构造函数中对其进行定义:

function Foo() {
    this.array = [];
}

因为这里this是指new调用生成的对象new Foo()

经验法则是:应将 * __

您可能需要阅读对象模型的详细信息其中描述了基于类的语言与基于原型的语言之间的差异以及对象的实际工作方式。

您可以通过访问一个对象的原型Object.getPrototypeOf(obj)(可能无法正常工作在很老的浏览器),并Object.getPrototypeOf(a)=== Object.getPrototypeOf(b)给你true。它是同一对象,也称为Foo.prototype

javascript 2022/1/1 18:13:45 有622人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶