Js-prototype

动态原型模式创建对象

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);
        };
    }
}

Q1:可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型

==Person==是一个构造函数,通过==new Person(...)==来生成实例对象。每当一个==Person==的对象生成时,==Person==内部的代码都会被调用一次。

如果去掉if的话,你每new一次(即每当一个实例对象生产时),都会重新定义一个新的函数,然后挂到==Person.prototype.sayName==属性上。而实际上,你只需要定义一次就够了,因为所有实例都会共享此属性的。所以如果去掉if的话,会造成没必要的时间和空间浪费;而加上if后,只在new第一个实例时才会定义sayName方法,之后就不会了。

Q2:if语句检查的可以是初始化之后应该存在的任何属性或方法 —— 不必用一大堆if语句检查每个属性和每个方法,只要检查其中一个即可。

假设除了==sayName==方法外,你还定义了很多其他方法,比如==sayBye、cry、smile==等等。此时你只需要把它们都放到对==sayName==判断的if块里面就可以了。

if (typeof this.sayName != "function") {
    Person.prototype.sayName = function() {...};
    Person.prototype.sayBye = function() {...};
    Person.prototype.cry = function() {...};
    ...
}

这样一来,要么它们全都还没有定义(==new==第一个实例时),要么已经全都定义了(==new==其他实例后),即它们的存在性是一致的,用同一个判断就可以了,而不需要分别对它们进行判断。