有关动态原型模式的问题

动态原型模式创建对象:

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语句有什么问题或者弊端?

书中的描述:

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

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

第一句话似懂非懂,第二句话完全不懂。

阅读 5.1k
2 个回答

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

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

至于第二个问题,是这样的:假设除了sayName方法外,你还定义了很多其他方法,比如sayByecrysmile等等。此时你只需要把它们都放到对sayName判断的if块里面就可以了。

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

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

function Person(fun, prop) {
    this.name = '小明';
    this.age = 25;
    this.job = '销售';
    
    if(typeof this[prop] != "function") {
        Person.prototype[fun] = function() {
            console.log(this[prop])
        }
    }
}

var person1 = new Person('sayName', 'name')
var person2 = new Person('sayAge', 'age')
var person3 = new Person('sayJon', 'job')
person1.sayName()
person1.sayAge()
person1.sayJon()
1 篇内容引用
推荐问题
宣传栏