js面向对象中的动态原型模式怎么理解?

看了红皮书,这里不太理解,懂的同学来聊聊自己的看法 1书上说 “这里只在sayName()方法不存在的情况下,才会将它添加到原型中。这段代码只会在初次调用构造函数时才会执行。此后,原型已经完成初始化,不需要再做什么修 改了。其中,if 语句检查的可以是初始化之后应该存在的任何属性或方法——不必用一大堆if 语句检查每个属性和每个方法;只要检查其中一个即可。对于采用这种模式创建的对象,还可以使用instanceof 操作符确定…
关注者
20
被浏览
3,594

4 个回答

这里的if判断主要是判断是否是初次运行构造函数。
  1. 初次运行的时候,this指向的实例对象没有sayName方法,实例对象的隐式原型也没有sayName方法,因此会进入到if方法体中,进行原型方法和属性的定义。
  2. 第二次运行的时候,this指向的实例对象的原型已经有了sayName方法,可以通过this.sayName访问到,因此不会进入到if方法中,避免原型方法的重复定义。
不能使用字面量的写法,是因为如果用字面量重写的话,初次创建的实例会有问题,因为使用构造函数时,是先创建了一个隐式原型指向原型的实例对象,然后再运行构造函数的代码的。
示例如下:
如果一定要使用字面量重写的话,可以考虑使用以下方式:
补充:不能使用字面量的写法原因,当使用构造函数的时候,是创建了一个隐式原型指向原型的实例对象,然后再运行构造函数的代码,因为函数需要调用才能运行,这时候就要先创建一个实例化对象,然后通过实例化对象调用运行函数,这时候实例化对象constructor指向的是最最开头新创建的Person对象,那么接着在函数底下用字面量就等于为Person重写了原型prototype,这时实例化对象和修改后的Person指向的原型prototype就失去了联系!