Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.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
JavaScript中的原型概念_Javascript_Prototype_Prototype Chain_Jsobject - Fatal编程技术网

JavaScript中的原型概念

JavaScript中的原型概念,javascript,prototype,prototype-chain,jsobject,Javascript,Prototype,Prototype Chain,Jsobject,我有一些关于原型的问题 如果我们通过Person函数构造函数的帮助创建了一个对象,比如说Dog。 假设Person在每个实例成员上有2个属性 var Dog = function (name,color){ this.name = name, this.color = color }; 现在我们已经从中创建了10个对象,比如Pug,Bulldog,等等 var Pug =new Dog('pug','white'); var Bulldog =new Dog('Bulldog',

我有一些关于原型的问题

如果我们通过
Person
函数构造函数的帮助创建了一个对象,比如说
Dog
。 假设
Person
在每个实例成员上有2个属性

var Dog = function (name,color){
   this.name =  name,
   this.color = color
};
现在我们已经从中创建了10个对象,比如
Pug
Bulldog
,等等

var Pug =new Dog('pug','white');
var Bulldog =new Dog('Bulldog','black');
现在我们突然想在Dog中添加一个属性,这样所有对象都可以访问它。我们可以通过两种方式实现:

  • 在函数构造函数中添加它
    this.leg:4
  • 使用
  • 现在我的问题是,在每一个变体中,属性都将被添加到它的prototype属性意味着作为prototype成员而不是作为实例成员?为什么?

    如果在创建一个对象之后,我们想要添加一些属性,并且我们想要将其添加为实例成员意味着自己的属性,那么我该怎么做呢

    我在浏览器控制台中获得的内容:

    Pug { name : 'pug',color :'white'}
    _ proto_ : { leg :4 }
    
    我期待的是:

    Pug { name : 'pug',color :'white',leg :4 }
    _proto_ :Object
    

    当您执行此操作时,
    Dog.prototype.leg=4您实际上是在修改原型本身。但是,将来实例化的对象将继承该新属性作为实例属性

    内存中的现有实例在实例化时将继续使用预先存在的实例属性

    var Dog=函数(名称、颜色){
    this.name=name,
    这个颜色
    };
    log(“内存中的现有实例”);
    let toy=新狗(“玩具”、“棕色”);
    let tay=新狗(“tay”、“灰色”);
    console.log(玩具“\n”,tay);//内存中的现有实例。
    log(“内存中的未来实例”);
    Dog.prototype.leg=4;
    让脚趾=新狗(“泰伊”,“黑色”);
    控制台。日志(脚趾);//内存中的未来实例。

    .as控制台包装{max height:100%!important;top:0;}
    使用选项1将在创建的每个新对象上附加一个实例属性:

    var Dog=函数(名称、颜色){
    this.name=name,
    这个颜色
    };
    var Pug=新狗('Pug','white');
    var Bulldog=新狗('Bulldog','black');
    //覆盖构造函数
    var Dog=函数(名称、颜色){
    this.name=name,
    this.color=color,
    这个腿=4
    };
    var Dalmatian=新狗(‘Dalmatian’、‘斑点’);
    //同时检查浏览器控制台
    控制台日志(Dalmatian);
    控制台日志(达尔马提亚腿)
    console.log(Dalmatian.hasOwnProperty('leg'));
    控制台日志(斗牛犬);
    控制台.日志(斗牛犬.腿)
    
    console.log(Bulldog.hasOwnProperty('leg'))
    在第一个选项中,您没有更改原型-如果您更改构造函数,那么您将得到预期的结果,因为这意味着通过构造函数创建的任何新实例都具有该属性。如果您想更改现有成员,那么您没有选择自动执行此操作-您可以重新创建所有成员,也可以收集所有成员并在循环中进行更改。您不能自动将属性从原型转移到每个实例。“因此未来的对象将继承该新属性”以及任何当前对象,因为原型链是活动对象。@VLAZ原型对象是,实例(构造函数属性)没有。您的回答表明,在您修改原型后,当前对象将不会获得
    leg
    属性,但它们确实获得了。“当前”和“未来”对象之间没有区别-在这两种情况下,它们都获得
    leg
    属性,并且它总是来自原型,它不是实际
    Dog
    对象上的实例属性。答案仍然不正确-对象没有获取实例属性-原型更改前后的所有Dog对象都从原型获取新原型。旧的和新的实例属性都不会得到新的实例属性-它总是相同的。它们都共享相同的属性,如果您使用
    toy.leg=3
    ,那么所有的狗都将是三条腿的。抱歉,
    toy.leg=3
    将分配一个实际实例属性,因此其余的狗将拥有
    leg=4
    。不过,prototype属性不是实例属性。非常感谢
    Pug { name : 'pug',color :'white'}
    _ proto_ : { leg :4 }
    
    Pug { name : 'pug',color :'white',leg :4 }
    _proto_ :Object