动态原型模式创建对象:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
if (typeof this.sayName != "function") {
Person.prototype.sayName = function() {
alert(this.name);
};
}
}
问题:动态原型模式中使用if的作用?不使用if语句有什么问题或者弊端?
书中的描述:
可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型;
if语句检查的可以是初始化之后应该存在的任何属性或方法 —— 不必用一大堆if语句检查每个属性和每个方法,只要检查其中一个即可。
第一句话似懂非懂,第二句话完全不懂。
Person
是一个构造函数,通过new Person(...)
来生成实例对象。每当一个Person的对象生成时,Person内部的代码都会被调用一次。如果去掉
if
的话,你每new一次(即每当一个实例对象生产时),都会重新定义一个新的函数,然后挂到Person.prototype.sayName
属性上。而实际上,你只需要定义一次就够了,因为所有实例都会共享此属性的。所以如果去掉if
的话,会造成没必要的时间和空间浪费;而加上if
后,只在new第一个实例时才会定义sayName
方法,之后就不会了。至于第二个问题,是这样的:假设除了
sayName
方法外,你还定义了很多其他方法,比如sayBye
、cry
、smile
等等。此时你只需要把它们都放到对sayName判断的if块里面就可以了。这样一来,要么它们全都还没有定义(new第一个实例时),要么已经全都定义了(new其他实例后),即它们的存在性是一致的,用同一个判断就可以了,而不需要分别对它们进行判断。