Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
prototype中值类型的javascript属性_Javascript_Prototype_Value Type - Fatal编程技术网

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语言中,通常只使用静态成员来完成


原型属性访问是不对称的

  • 获取属性时-如果对象没有属性,它将从原型中获取属性。这是:
  • 设proto为O的[[Prototype]]内部属性的值
  • 如果proto为null,则返回undefined
  • 返回调用proto的[[GetProperty]]内部方法(参数为P)的结果
    • 设置属性时-始终在对象而不是原型上设置属性。按规定
    要了解:

     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。