在看《JavaScript高级程序设计》,章节6.2.2中最后(147页)提供了一种构造函数定义方式,但作者自己又说有问题,但并未讲清楚问题是什么,所以请大家讲讲?
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
alert(this.name);
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.sayName===person2.sayName; // true
这段代码的原文评注如下: 在这个例子中,我们把sayName()函数的定义转移到了构造函数外部。而在构造函数内部,我们 将sayName 属性设置成等于全局的sayName 函数。这样一来,由于sayName 包含的是一个指向函数 的指针,因此person1 和person2 对象就共享了在全局作用域中定义的同一个sayName()函数。这 样做确实解决了两个函数做同一件事的问题,可是新问题又来了:在全局作用域中定义的函数实际上只 能被某个对象调用,这让全局作用域有点名不副实。而更让人无法接受的是:如果对象需要定义很多方 法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。
有木有觉得粗体这段不知所云?