prototype中值类型的javascript属性
我的理解是,相同类型的所有对象都将共享相同的原型。因此,对原型的更改将反映在每个对象上。但对于值类型的属性,情况似乎并非如此。这种财产是如何储存的prototype中值类型的javascript属性,javascript,prototype,value-type,Javascript,Prototype,Value Type,我的理解是,相同类型的所有对象都将共享相同的原型。因此,对原型的更改将反映在每个对象上。但对于值类型的属性,情况似乎并非如此。这种财产是如何储存的 function Person() { } Person.prototype.name = "John"; var p1 = new Person(); p1.name = "Luke"; var p2 = new Person(); p2.name = "Mary"; console.log(p1.name); // Luke
function Person() {
}
Person.prototype.name = "John";
var p1 = new Person();
p1.name = "Luke";
var p2 = new Person();
p2.name = "Mary";
console.log(p1.name); // Luke instead of Mary
console.log(p2.name); // Mary
如果我想实现相同类型的对象计数。最好的方法是什么?在另一种OO语言中,通常只使用静态成员来完成
原型属性访问是不对称的
- 获取属性时-如果对象没有属性,它将从原型中获取属性。这是:
- 设置属性时-始终在对象而不是原型上设置属性。按规定
var proto = {x:4};
var child = Object.create(proto); // create object with prototype set to `proto`
child.x; // 4, fetched from prototype
child.x = 10;
child.x; // 10, fetched from child
proto.x; // 4, setting on child did not change the prototype
Object.getPrototypeOf(child).x = 6; // you can get around it, and set on the proto.
您可以阅读有关它的更多信息,以及它为何以这种方式工作。当您尝试检索属性时,会询问该对象是否定义了自己的属性。如果没有,则检查其构造函数的原型。这种情况一直发生在原型链上,直到找到一个值为止 这里有一个例子
// Person constructor.
var Person = function (name) {
if (name) {
this.name = name;
}
};
// method to print the name in the console
Person.prototype.sayName = function () {
console.log(this.name);
}
// create two people with names
var person1 = new Person('Nicholas');
var person2 = new Person('Greg');
person1.sayName();
person2.sayName();
// =========================================
// This dude has no name.
var person3 = new Person();
person3.sayName();
// Add a name to the prototype.
// This name is available to all Person instances if they
// don't define their own.
Person.prototype.name = 'Dick';
// These two have their own names.
person1.sayName();
person2.sayName();
// This guy doesn't have his own name, so he
// uses the one from the prototype.
person3.sayName();
谢谢你的回答。但如果我想实现相同类型的对象计数。什么是最好的方法?@leon使用工厂,创建对象和管理对象集合不是对象本身的责任。我将创建一个PersonFactory对象,其中包含人数,并通过它创建人员。那是一个人不负责它不需要负责的事情。(静态或全局变量也可以工作,但更糟糕)。看,我知道工厂的优势,但我总是喜欢轻量级的做事方式(代码更少)。再次感谢。关于您的示例,还有一个问题,我不熟悉Object.create。我认为对象文字只会添加自己的属性。但是你的代码表明proto变成了child对象的原型,我不知道。什么是child和proto的构造函数?当我调试这段代码时,child的原型是“Object”,而不是proto。