首先,穩(wěn)妥對象,指的是沒有公共屬性,而且其方法也不引用 this 的對象。穩(wěn)妥對象最適合在一些安全的環(huán)境中(這些環(huán)境中會禁止使用 this 和 new),或者在防止數(shù)據(jù)被其他應(yīng)用程序(如 Mashup 程序)改動時使用。穩(wěn)妥構(gòu)造函數(shù)遵循與寄生構(gòu)造函數(shù)類似的模式,但有兩點不同:一是新創(chuàng)建對象的實例方法不引用 this;二是不使用 new 操作符調(diào)用構(gòu)造函數(shù)。按照穩(wěn)妥構(gòu)造函數(shù)的要求,可以將前面的 Person 構(gòu)造函數(shù)重寫如下:
function Person(name, age, job) {
var o = new Object;
// 可以在這里定義私有的變量和函數(shù)
o.sayName = function() {
console.log(name);
}
return o;
}
var person1 = new Person("Neo", 29, "Software Engineer");
person1.sayName();
注意,在以這種模式創(chuàng)建的對象中,除了使用 sayName() 方法外,沒有其他辦法訪問 name 的值。即使有其他代碼會給這個對象添加方法或數(shù)據(jù)成員,但也不可能有別的辦法訪問傳入到構(gòu)造函數(shù)中的原始數(shù)據(jù)。穩(wěn)妥構(gòu)造函數(shù)模式提供的這種安全性,使得它非常適合在某些安全執(zhí)行環(huán)境下使用。
注意:與寄生構(gòu)造函數(shù)模式類似,使用穩(wěn)妥構(gòu)造函數(shù)模式創(chuàng)建的對象與構(gòu)造函數(shù)之間也沒有什么關(guān)系,因此 instanceof 操作符對這種對象也沒有意義。