天天看點

JS程式設計建議——77:推薦作用域安全的構造函數

建議77:推薦作用域安全的構造函數

構造函數其實是一個使用new運算符的函數。當使用new調用時,構造函數的内部用到的this對象會指向新建立的執行個體。

function Person(name, age, job) {

}

var person = new Person("Nicholas", 34, 'software Engineer');

在沒有使用new運算符來調用構造函數的情況下,由于該this對象是在運作時綁定的,是以直接調用Person()會将該對象綁定到全局對象window上,這将導緻錯誤屬性意外增加到全局作用域上。這是由于this的晚綁定造成的,在這裡this被解析成了window對象。

解決這個問題的方案是建立一個作用域安全的構造函數。首先确認this對象是否為正确的類型執行個體,如果不是,則建立新的執行個體并傳回。

如果使用的構造函數擷取繼承且不使用原型鍊,那麼這個繼承可能就被破壞。

function Polygon(sides) {

function Rectangle(width, height) {

var rect = new Rectangle(5, 10);

alert(rect.sides); //undefined

Rectangle構造函數的作用域是不安全的。在新建立一個Rectangle執行個體後,這個執行個體通過Polygon.call繼承了sides屬性,但由于Polygon構造函數的作用域是安全的,this對象并非是Polygon的執行個體,是以會建立并傳回一個新的Polygon對象。

由于Rectangle構造函數中的this對象并沒有得到增長,同時Polygon.call傳回的值沒有被用到,是以Rectangle執行個體中不會有sides屬性。構造函數配合使用原型鍊可以解決這個問題。

//使用原型鍊

Rectangle.prototype = new Polygon();//還是不懂???????????

alert(rect.sides); //2

這時構造函數的作用域就很有用了。

繼續閱讀