修改孩子的原型会影响父母的原型吗?

约翰·梅里诺

尽管下面的实现看起来不错,因为它允许孩子拥有自己的成员副本(不具有修改父母自己的成员的能力),并且使用原型链,因此不会为每个对象实例创建属性,它效率不高,因为调用了Parent构造函数两次(一次执行apply和新的Parent实例化):

function Parent(a,b,c,d){
  this.a = a;
  this.b = b;
  this.c = c;
  this.d = d;
}

Parent.prototype.say_a = function(){
  return this.a;
}

Parent.prototype.say_b = function(){
  return this.b;
}

Parent.prototype.say_c = function(){
  return this.c;
}

Parent.prototype.say_d = function(){
  return this.d;
}

Parent.prototype.not_going_to_be_copied = function(){
  console.log(“This function will not be recreated from one object instantiation to the next, making it very efficient.”);
}


function Child(a,b,c,d){
  Parent.apply(this,arguments);
}
Child.prototype = new Parent();
c = new Child("a","b","c","d");
console.log([c.say_a(),c.say_b(),c.say_c(),c.say_d()].join(" "));

Javascript Patterns中的Stoyan提到了该替代方法,它根本不调用Parent构造函数:

Child.prototype = Parent.prototype;

但是,他说这样做的一个缺点是,如果继承链中某个地方的一个孩子或孙子修改了原型,它将影响所有父母和祖父母。

但是,我无法复制该主张:

function Parent(){}

Parent.prototype.set_a = function(a){
  this.a = a;
}

Parent.prototype.get_a = function(){
  return this.a;
}

function Child(){}
Child.prototype = Parent.prototype;

var c = new Child();
var p = new Parent();
c.set_a("a");
console.log(c.get_a()); // a
p.set_a("b");
console.log(p.get_a()); // b
console.log(c.get_a()); // a
c.prototype = {};
console.log("after mod " + c.get_a()); // after mod a
console.log("after mod " + p.get_a()); // after mod b
c.get_a = function(){return "am I changing parent?"}
console.log(c.get_a()); // am I changing parent?
console.log(p.get_a()); // b

如您所见,无论我如何修改Child的原型,它都不会影响Parent的原型。那我想念什么吗?孩子们对原型的修改会对父母产生影响吗?

用户名

Child.prototype = Parent.prototype同一对象绑定到两个构造原型属性(和相当傻,IMOHO)。因此,对对象的修改称为,Child.prototype 修改了Parent.prototype所要求的“影响所有对象”,因为两个表达式都求值于同一对象

考虑一下以后是否;

Child.prototype.hello = "Hello world"
// Noting that
Child.prototype === Parent.prototype  // -> true, as per initial condition

然后;

var p = new Parent()
p.hello                  // -> "Hello world", showing the "affecting" behavior    

因此可以看出,修改Child.prototype也会影响Parent实例的[prototype]-因为修改同一对象

但是,此问题并未得到重现,因为无法以这种方式“分配实例的原型”。也就是说,[prototype]链在创建新实例时根据构造函数的prototype属性设置(或通过Object.create设置)。分配给实例的prototype属性是..只是分配一个普通属性。

var c = new Child()
c.prototype = "Hello world"
typeof c.say_a                   // -> "function", didn't assign [prototype]
c.prototype                      // -> "Hello world"
c.__proto__ === Child.prototype  // -> true, in browsers supporting __proto__

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数声明或函数原型会影响程序的工作吗

来自分类Dev

JavaScript原型继承:为什么调用child的getter / setter会影响父母?

来自分类Dev

原型中的函数声明会“污染”原型吗?

来自分类Dev

更改原型的原型以影响实例JS

来自分类Dev

让孩子修改其父母

来自分类Dev

原型上的属性会覆盖实际对象的属性吗?

来自分类Dev

用 Object.create 创建的对象会继承原型吗?

来自分类Dev

原型的属性受到不同的影响

来自分类Dev

悬停时影响父母的孩子

来自分类Dev

@Inject的原型可能吗?

来自分类Dev

@Inject的原型可能吗?

来自分类Dev

在javascript中使用原型会对ajax调用和异步代码产生负面影响吗?

来自分类Dev

更新原型定义后,旧的原型文件会怎样?

来自分类Dev

无法扩展String原型吗?

来自分类常见问题

孩子的边距不会影响父母的身高

来自分类Dev

Chome和Firefox阻止在coffeescript中修改派生类的原型吗?

来自分类Dev

原型方法中的“ this”不总是指对象本身的原型吗?

来自分类Dev

JavaScript修改函数原型的更好方法

来自分类Dev

修改对象的原型不起作用

来自分类Dev

修改生成器函数原型

来自分类Dev

Javascript原型和修改原始对象

来自分类Dev

修改整个项目的对象原型

来自分类Dev

如果创建新的原型属性,对象会更改其隐藏类吗?

来自分类Dev

Object.create会更改Chrome中原型对象的控制台输出吗?

来自分类Dev

通过this.x访问相同的原型变量'x'会创建单独的副本吗?

来自分类Dev

修改WordPress中父母和孩子的图标

来自分类Dev

自定义职位类型的孩子会继承父母的分类法吗?

来自分类Dev

分叉的孩子会始终获得与父母的文件ID相同的文件ID吗?

来自分类Dev

CSS 悬停只影响孩子而不影响父母

Related 相关文章

  1. 1

    函数声明或函数原型会影响程序的工作吗

  2. 2

    JavaScript原型继承:为什么调用child的getter / setter会影响父母?

  3. 3

    原型中的函数声明会“污染”原型吗?

  4. 4

    更改原型的原型以影响实例JS

  5. 5

    让孩子修改其父母

  6. 6

    原型上的属性会覆盖实际对象的属性吗?

  7. 7

    用 Object.create 创建的对象会继承原型吗?

  8. 8

    原型的属性受到不同的影响

  9. 9

    悬停时影响父母的孩子

  10. 10

    @Inject的原型可能吗?

  11. 11

    @Inject的原型可能吗?

  12. 12

    在javascript中使用原型会对ajax调用和异步代码产生负面影响吗?

  13. 13

    更新原型定义后,旧的原型文件会怎样?

  14. 14

    无法扩展String原型吗?

  15. 15

    孩子的边距不会影响父母的身高

  16. 16

    Chome和Firefox阻止在coffeescript中修改派生类的原型吗?

  17. 17

    原型方法中的“ this”不总是指对象本身的原型吗?

  18. 18

    JavaScript修改函数原型的更好方法

  19. 19

    修改对象的原型不起作用

  20. 20

    修改生成器函数原型

  21. 21

    Javascript原型和修改原始对象

  22. 22

    修改整个项目的对象原型

  23. 23

    如果创建新的原型属性,对象会更改其隐藏类吗?

  24. 24

    Object.create会更改Chrome中原型对象的控制台输出吗?

  25. 25

    通过this.x访问相同的原型变量'x'会创建单独的副本吗?

  26. 26

    修改WordPress中父母和孩子的图标

  27. 27

    自定义职位类型的孩子会继承父母的分类法吗?

  28. 28

    分叉的孩子会始终获得与父母的文件ID相同的文件ID吗?

  29. 29

    CSS 悬停只影响孩子而不影响父母

热门标签

归档