成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

《JavaScript高級(jí)程序設(shè)計(jì)》——對(duì)象學(xué)習(xí)筆記

appetizerio / 3366人閱讀

摘要:在構(gòu)造函數(shù)內(nèi)部,將屬性設(shè)置成等于全局的函數(shù)。調(diào)用構(gòu)造函數(shù)的一個(gè)實(shí)例后,該實(shí)例內(nèi)部將包含一個(gè)指針中稱(chēng)為,指向構(gòu)造函數(shù)的原型對(duì)象。原型對(duì)象的問(wèn)題省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實(shí)例在默認(rèn)情況下都取得相同的屬性值。

創(chuàng)建對(duì)象

使用對(duì)象字面量的形式一個(gè)接口會(huì)創(chuàng)建很多對(duì)象, 會(huì)產(chǎn)生大量的重復(fù)代碼。

工廠模式:用函數(shù)來(lái)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)
function createPerson (name,age,job)
{
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName =function()
    {
        alert(this.name);
    }
    return o;
}

var person1 = createPerson("Simon", 29, "software Engineer");
var person2 = createPerson("Zaynex",22, "Doctor");

這種模式解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但卻沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類(lèi)型)

構(gòu)造函數(shù)模式
- 可用于創(chuàng)建特定模式的對(duì)象,像Object、Array等原生構(gòu)造函數(shù),在運(yùn)行時(shí)會(huì)自動(dòng)出現(xiàn)在執(zhí)行環(huán)境中。

我們利用構(gòu)造函數(shù)重寫(xiě)下剛才的函數(shù)。

function createPerson(name, age, job)
    {
        this.name = name;
        this.age = age;
        this.job = job;
        this.sayName = function()
        {
            alert(this.name);
        };
    }

    var person1 = new Person("Simon",29, "software Engineer");
    var person2 = new Person("Simon",29, "software Engineer");
構(gòu)造函數(shù)與工廠模式的差異

沒(méi)有顯示地創(chuàng)建對(duì)象;

直接將屬性和方法賦給this對(duì)象;

沒(méi)有 return 語(yǔ)句;

我們注意到Person開(kāi)頭是大寫(xiě),按照慣例來(lái)講,構(gòu)造函數(shù)開(kāi)頭字母是大寫(xiě),非構(gòu)造函數(shù)以小寫(xiě)字母開(kāi)頭。

調(diào)用構(gòu)造函數(shù)四步驟

創(chuàng)建一個(gè)新對(duì)象;

將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this就指向了這個(gè)新對(duì)象);

執(zhí)行構(gòu)造函數(shù)中的代碼(為構(gòu)造函數(shù)新對(duì)象添加屬性)

返回新對(duì)象

person1和person2都保存著Person的一個(gè)不同的實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Person。

alert(person1.constructor == Person) //true;
alert(person2.constructor == Person) //true;

對(duì)象的constructor屬性最初是用來(lái)標(biāo)識(shí)對(duì)象類(lèi)型的。但是提到檢測(cè)對(duì)象類(lèi)型,還是instanceof操作符更可靠一些。

alert(person1 instanceof Object);
alert(person1 instanceof Person);
alert(person2 instanceof Object);
alert(person2 instanceof Person);
//都為true.

我們所創(chuàng)建的所有對(duì)象都是Object的實(shí)例,同時(shí)也是Person的實(shí)例。

創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以作為實(shí)例標(biāo)識(shí)為一種特定的類(lèi)型;構(gòu)造函數(shù)模式勝過(guò)工廠模式的地方

把構(gòu)造函數(shù)當(dāng)函數(shù)
- 任何函數(shù),只要通過(guò)  new 操作符來(lái)調(diào)用,那它就可以作為構(gòu)造函數(shù);

//當(dāng)做構(gòu)造函數(shù)使用

var person = new Person("Simon", 29, "software Engineer");
person.sayName(); //Simon

//普通函數(shù)調(diào)用
Person("Genf", 23, "DOCTOR");  //添加到window
window.sayName();  // Genf
以剛才的那種方式定義的構(gòu)造函數(shù)定義在Global對(duì)象中(在瀏覽器中是window對(duì)象),在全局作用域中調(diào)用函數(shù)時(shí),this指向的是window對(duì)象

// 在另外一個(gè)對(duì)象的作用域中調(diào)用
var o = new Object();
Person.call(o, "Kristen", 25, "nusd");
o.sayName(); // Kristen    
構(gòu)造函數(shù)的缺陷

每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。

person1 和 person2 都有一個(gè)名為 sayName() 的方法;但那兩個(gè)方法都不是同一個(gè) Function 的實(shí)例,因此會(huì)有不同的作用域鏈和標(biāo)識(shí)符解析;不同實(shí)例上的同名函數(shù)是不同的。

不要忘了,每個(gè)函數(shù)都是一個(gè)對(duì)象!所以sayName方法也可以這樣寫(xiě),因此每個(gè)Person實(shí)例都包含著不同的Function實(shí)例。以這種方式創(chuàng)建函數(shù),會(huì)導(dǎo)致不同餓作用域和標(biāo)識(shí)符解析。

this.sayName = new Function("alert(this.name)");  //與聲明函數(shù)在邏輯上是等價(jià)的

我們可以檢驗(yàn)下

alert(person1.sayName() == person2.sayName) //false;

創(chuàng)建兩個(gè)完成相同任務(wù)的Function 實(shí)例沒(méi)有必要,況且有this對(duì)象在,根本不用在執(zhí)行代碼前就把函數(shù)綁定到特定對(duì)象上面。

我們可以通過(guò)函數(shù)定義轉(zhuǎn)移構(gòu)造函數(shù)外部來(lái)解決這個(gè)問(wèn)題。

function Person(name, age ,job)

{
    this.name = name;
    this.age = age;
    this.sayName = sayName;
}

function sayName()
{
    alert(this.name);
}

var person1 = new Person("Simon", 29, "software Engineer");
var person2 = new Person("Zaynex", 29, "DOCTOR");

把sayName()函數(shù)的定義轉(zhuǎn)移到了構(gòu)造函數(shù)外部。

在構(gòu)造函數(shù)內(nèi)部,將sayName屬性設(shè)置成等于全局的 sayName 函數(shù)。這樣sayName 包含的是一個(gè)指向函數(shù)的指針。 person1和person2共享同一個(gè)sayName()函數(shù)。

但問(wèn)題是:
在全局作用域中定義的函數(shù)實(shí)際上只能被某個(gè)對(duì)象調(diào)用,如果對(duì)象需要定義很多方法,那么就要定義多個(gè)全局函數(shù)。

因此我們需要用原型模式來(lái)解決這個(gè)問(wèn)題。

原型模式

我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè) prototype(原型) 屬性,這個(gè)屬性屬于指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類(lèi)型的所有實(shí)例的共享的屬性和方法。即通過(guò)構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。

我們不必將構(gòu)造函數(shù)定義對(duì)象實(shí)例的信息中,而是可以將這些信息直接添加到對(duì)象原型中。

function Person(){
    }

    Person.prototype.name ="Simon";
    Person.prototype.age = 29;
    Person.prototype.job = "software Engineer";
    Person.prototype.sayName = function(){
        alert(this.name);
    };


    var person1 = new Person();
    person1.sayName();

    var person2 = new Person();
    person2.sayName();

    alert(person1.sayName == person2.sayName);
    

實(shí)際上,person1和person2都不包含屬性和方法, 但可以調(diào)用person1.sayName().這是通過(guò)查找對(duì)象屬性的過(guò)程來(lái)實(shí)現(xiàn)的。

理解原型對(duì)象

無(wú)論何時(shí),只要?jiǎng)?chuàng)建了新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè) prototype 屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。

在默認(rèn)情況下,所有原型都會(huì)自動(dòng)獲得一個(gè)constructor(構(gòu)造函數(shù))屬性,這個(gè)屬性包含在一個(gè)指向 prototype屬性所在的函數(shù)的指針。舉例說(shuō)明: Person.prototype.constructor 指向Person.

創(chuàng)建了自定義構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得 constructor 屬性。其他方法都是從Object繼承來(lái)的。

調(diào)用構(gòu)造函數(shù)的一個(gè)實(shí)例后,該實(shí)例內(nèi)部將包含一個(gè)指針(ES5中稱(chēng)為[[Prototype]],指向構(gòu)造函數(shù)的原型對(duì)象。在腳本中沒(méi)有標(biāo)準(zhǔn)形式訪問(wèn)[[Prototype]],但在FF,SF,Chrome中的每個(gè)對(duì)象都支持屬性_proto_;在其他實(shí)現(xiàn)中,該屬性對(duì)腳本不可見(jiàn)。

要明確的是, 這個(gè)鏈接存在于實(shí)例與構(gòu)造函數(shù)的原型對(duì)象之間,而非實(shí)例與構(gòu)造函數(shù)之間。

雖然在現(xiàn)實(shí)中無(wú)法訪問(wèn)到[[Prototype]],但可以通過(guò) isPrototypeOf()來(lái)確定是否存在這種關(guān)系。
在ES5中新增一個(gè)方法,使用 Object.getPrototypeOf()可以方便的獲取一個(gè)對(duì)象的原型

每當(dāng)代碼讀取某個(gè)對(duì)象的某個(gè)屬性時(shí),都會(huì)執(zhí)行一次搜索,
1.先從實(shí)例本身開(kāi)始搜索屬性,存在,搜索結(jié)束。若不存在,執(zhí)行2
2.從實(shí)例的原型開(kāi)始搜索屬性。

繼續(xù)剛才的代碼。如果我們繼續(xù)給實(shí)例添加相同的屬性,會(huì)怎樣?

function Person(){
    }

    Person.prototype.name ="Simon";
    Person.prototype.age = 29;
    Person.prototype.job = "software Engineer";
    Person.prototype.sayName = function(){
        alert(this.name);
    };


    var person1 = new Person();
    var person2 = new Person();
    person1.name = "xiwenzheng";

    alert(person1.name) //xiwenzheng  ——來(lái)自實(shí)例
    alert(person2.name) // Simon  ——來(lái)自原型
    

在person1這個(gè)實(shí)例中重寫(xiě)屬性,那么解釋器搜索到了實(shí)例本身的屬性直接返回,對(duì)于person2而言,實(shí)例中沒(méi)有屬性,那么再往實(shí)例的原型開(kāi)始搜素屬性。

給對(duì)象添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中保存的同名屬性,就是阻止我們?cè)L問(wèn)原型對(duì)象,但并不會(huì)修改原型對(duì)象中的同名屬性。即使將person1.name 設(shè)置為 null 也不會(huì)影響原型對(duì)象中的同步屬性。

不過(guò)delete 實(shí)例屬性,就可以訪問(wèn)原型對(duì)象中的屬性了。

function Person(){

    }

    Person.prototype.name ="Simon";
    Person.prototype.age = 29;
    Person.prototype.job = "software Engineer";
    Person.prototype.sayName = function(){
        alert(this.name);
    };
    var person1 = new Person();
    var person2 = new Person();
    person1.name = "xiwenzheng";
    alert(person1.name); //xiwenzheng  ——來(lái)自實(shí)例
    alert(person2.name); // Simon  ——來(lái)自原型
    delete person1.name;
    alert(person1.name); // Simon 來(lái)自原型
    

使用hasOwnProperty()可以檢測(cè)一個(gè)屬性是否存在實(shí)例中還是存在原型中,這個(gè)方法只在給定屬性存在于對(duì)象實(shí)例中才會(huì)返回 true;

我們繼續(xù)采用剛才刪除部分的整段代碼。

alert(person1.hasOwnProperty("name")); // 返回false

原先person1.name是存在對(duì)象實(shí)例中的(被我們?cè)O(shè)為了"Zaynex"),但是被我們delete了。
如果我們不delete的話,那就是true了。要想獲得原型屬性的描述符,必須要在原型對(duì)象上調(diào)用 Object.hasOwnPropertydDsecriptor();

原型與 in 操作符

in 操作符會(huì)在通過(guò)對(duì)象能夠訪問(wèn)給定屬性時(shí)返回 true ,不論該實(shí)行存在于實(shí)例中還是原型中。

利用in:判斷是否有該屬性

利用hasOwnProperty()判斷是否存在對(duì)象實(shí)例中;

結(jié)合以后就可以判斷該屬性是在原型中還是在實(shí)例中。

function hasPrototypeProperty(object, name ){

return !object.hasOwnProperty(name) && (name in object);

}
person1.name = "Zaynex";
alert(hasPrototypeProperty(person1, "name")); //false;存在實(shí)例中

for-in 循環(huán)時(shí),返回的都是通過(guò)對(duì)象訪問(wèn)的、可枚舉的屬性(即將[[Enumberable]]標(biāo)記為true的屬性),在ES5中constructor 和 prototype屬性的 [[Enumberable]]

設(shè)為false,但并不是所有瀏覽器都照此實(shí)現(xiàn)。
想取得對(duì)象上所有可枚舉的實(shí)例屬性,可以使用Object.Keys()方法。

function Person(){
    }

    Person.prototype.name ="Simon";
    Person.prototype.age = 29;
    Person.prototype.job = "software Engineer";
    Person.prototype.sayName = function(){
        alert(this.name);
    };

    var keys = Object.keys(Person.prototype);
    alert(keys);//  name ,age, job, sayName

    var p1 = new Person();
    p1.name = "Rob";
    p1.age = 29;

    var p1keys = Object.keys(p1);
    alert(p1keys);  // name ,age 
    

如果想得到所有實(shí)例屬性,不論是否可枚舉,都可以使用 Object.getOwnPropertyNames()

var keys = Object.keys(Person.prototype);
alert(keys);//  constructor, name ,age, job, sayName

更簡(jiǎn)單的原型語(yǔ)法

之前的例子中每添加一個(gè)屬性和方法都要 Person.prototype,我們進(jìn)行適當(dāng)?shù)姆庋b。

function Person(){

}

Person.prototype = {
    name : "Simon",
    age : 29;
    job : "software Engineer",
    sayName : function  () {
        alert(this.name);
    }
};

我們將 Person.prototype 設(shè)置為等于一個(gè)以對(duì)象字面量形式創(chuàng)建的新對(duì)象。
之前介紹到,每創(chuàng)建一個(gè)函數(shù),同時(shí)會(huì)創(chuàng)建它的prototype對(duì)象,這個(gè)對(duì)象會(huì)指定獲得constructor 屬性。而我們?cè)谶@里的語(yǔ)法本質(zhì)上是重寫(xiě)了默認(rèn)的 prototype 對(duì)象。

所以 constructor屬性也編程了新對(duì)象的屬性。(指向Object構(gòu)造函數(shù)),不再指向Person了。

instanceof 測(cè)試 Object 和 Person 都返回 true,但constructor 屬性則等于Object而不等于 Person ;

如果 constructor 的值很重要,則可以特意設(shè)置回適當(dāng)?shù)闹?/p>

function Person(){
}

Person.prototype = {
    constructor:Person,
    name : "Simon",
    job : "software Engineer",
    sayName : function () {
        alert(this.name);
    }
}

注意,以這種方式重設(shè)constructor屬性會(huì)導(dǎo)致 [[Enumberable]]特性設(shè)置為true,但默認(rèn)我們是不可枚舉constructor屬性的。

為了兼容ES5的JS引擎,可以用 Object.defineProperty();

function Person(){
    }

    Person.prototype = {
        name : "Simon",
        job : "software Engineer",
        sayName : function () {
            alert(this.name);
        }
    }
Object.defineProperty(Person.prototype, "constructor", {
    enumerable: false,
    value: Person
});
原型的動(dòng)態(tài)性

在原型中找值的過(guò)程是一次搜索,因此我們對(duì)原型對(duì)象所做的任何修改都能立即從實(shí)例中反應(yīng)出來(lái)——即使是先創(chuàng)建實(shí)例后修改原型。
不信你看:

var friend = new Person();
Person.prototype.sayHi = function(){
    alert("hi");
};
friend.sayHi();  // "hi" 

這個(gè)可以歸結(jié)于實(shí)例與原型之間的松散鏈接關(guān)系。我們首先會(huì)在實(shí)例中搜索sayHi的屬性,在沒(méi)找到的情況下會(huì)繼續(xù)搜索原型,因?yàn)閷?shí)例與原型之間的鏈接只不過(guò)是一個(gè)指針。

但是如果重寫(xiě)整個(gè)原型對(duì)象,情況就不一樣了。調(diào)用構(gòu)造函數(shù)時(shí)會(huì)為實(shí)例添加一個(gè)指向最初原型的[[Prototype]]指針,而把原型修改為另外一個(gè)對(duì)象就等于切斷了構(gòu)造函數(shù)與最初原型之間的聯(lián)系。

請(qǐng)記住,實(shí)例中的指針僅指向原型,而不指向構(gòu)造函數(shù)。

function Person(){

}

var  friend = new Person();

Person.prototype = {
    constructor:Person,
    name : "Simon",
    job : "software Engineer",
    sayName : function () {
        alert(this.name);
    }
};

friend.sayName();  //error

在這個(gè)例子中,我們創(chuàng)建了Person的實(shí)例,然后又重寫(xiě)了其原型對(duì)象,然后在調(diào)用sayName()時(shí)發(fā)生錯(cuò)誤,因此friend指向的原型不包含以該名字命名的屬性。

原型對(duì)象的問(wèn)題

省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實(shí)例在默認(rèn)情況下都取得相同的屬性值。

共享導(dǎo)致的問(wèn)題,很多屬性可以共享,對(duì)于包含引用類(lèi)型值的屬性來(lái)說(shuō),問(wèn)題比較突出。

function Person(){

}

Person.prototype = {
    constructor:Person,
    name : "Simon",
    job : "software Engineer",
    friends : ["Shelby", "Court"],
    sayName : function () {
        alert(this.name);
    }
};

var  person1 = new Person();
var person2 = new Person();

person1.friends.push("Van");

alert(person1.friends === person2.friends) // true;

修改person1.friends 引用的數(shù)組,添加字符串,由于 friends數(shù)組存在 Person.prototype 而非 person1中,所以修改也會(huì)造成person2.friends反映出來(lái),如果我們的初衷就是要共享同一個(gè)數(shù)組,那無(wú)話可說(shuō)。

可是一般都是要有屬于自己的全部屬性的。而這個(gè)問(wèn)題正是我們很少看到有人多帶帶使用原型模式的原因。

組合使用構(gòu)造函數(shù)模式和原型模式

創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式就是這個(gè)。構(gòu)造函數(shù)用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。這樣,每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性的副本,但又同事共享著對(duì)方法的引用,最大限度節(jié)省了內(nèi)存。此外,這種混成模式還支持向構(gòu)造函數(shù)傳遞參數(shù)。

function Person (name, age, job){
       this.name = name;
       this.age = age;
       this.job = job;
       this.friends = ["Shelby", "Court"];
   }

   Person.prototype = {
       constructor : Person,
       sayName : function (){
           alert(this.name);
       }
   }


   var person1 = new Person("Nicholas", 29, "software Engineer");
   var person2 = new Person("Greg", 27, "DOCTOR");

   person1.friends.push("Van");
   alert(person1.friends);  // Shelby,Court,Van
   alert(person2.friends); // shelby,Court
   alert(person1.friends === person2.friends); // false
   alert(person1.sayName === person2.sayName); // true
   

實(shí)例屬性都是在構(gòu)造函數(shù)中定義的,所有實(shí)例共享的屬性是在 constructor 和方法sayName()是在原型中定義的。

動(dòng)態(tài)原型模式

當(dāng)其他OO語(yǔ)言經(jīng)驗(yàn)開(kāi)發(fā)人員看到獨(dú)立的構(gòu)造函數(shù)和原型時(shí),會(huì)感到困惑。因此出現(xiàn)了 動(dòng)態(tài)原型模式———即把所有信息都封裝在了構(gòu)造函數(shù)中,而通過(guò)在構(gòu)造函數(shù)中初始化原型(僅在必要的情況下),又保持了同事使用構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)。

換句話說(shuō),可以通過(guò)檢查某個(gè)應(yīng)該存在的方法是否有效,來(lái)決定是否需要初始化原型。

 function Person (name, age, job){
    //屬性
       this.name = name;
       this.age = age;
       this.job = job;
       this.friends = ["Shelby", "Court"];

       if( typeof this.sayName != "function"){
           Person.prototype.sayName = function() {
               alert(this.name);
           };
       }
 }
    // 只有在sayName不存在的情況下, 才將其添加到原型中,這段代碼只會(huì)在初次調(diào)用函數(shù)時(shí)執(zhí)行。此后原型已經(jīng)完成初始化,不需要再做修改。
 var  friends1 = new Person("Nicholas", 29, "software Engineer");
 var friends2 = new Person("Zaynex",19,"Engineer");
 friends1.sayName();
 friends2.sayName();

由于第一次當(dāng)friends1初始化之后,friends2就不需要再進(jìn)行初始化原型。
詳情參考點(diǎn)擊此處

寄生構(gòu)造函數(shù)模式

在上述幾種模式都不適用的情況下,我們可以使用寄生構(gòu)造函數(shù)模式
基本思想:創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象。

 function Person (name, age, job){
       var o = new Object();
       o.name = name;
       o.age = age;
       o.job = job;
       o.sayName = function(){
           alert(this.name);
       };
       return o;
   }

   var friend = new Person ("Nicholas", 29, "software Engineer");
   friend.sayName(); // Nicholas
寄生構(gòu)造函數(shù)應(yīng)用

在特殊情況下為對(duì)象創(chuàng)建構(gòu)造函數(shù)。 假設(shè)我們想創(chuàng)建一個(gè)具有額外方法的特殊數(shù)組,由于不能直接修改Array構(gòu)造函數(shù),因此可以使用這個(gè)模式。

 function SpecialArray(){
          var values = new Array();

           values.push.apply(values, arguments);

           values.toPipedString = function(){
               return this.join("|");
           }

           return values;
    }

    var colors = new SpecialArray("red", "blue", "green");
    alert(colors.toPipedString());  // red|blue|green
    

寄生構(gòu)造函數(shù)模式:返回的對(duì)象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性沒(méi)有關(guān)系;不能依賴(lài)于 instanceof操作符確定對(duì)象類(lèi)型。因此不建議在已使用其他模式的情況下使用該種模式。

穩(wěn)妥構(gòu)造函數(shù)模式 應(yīng)用場(chǎng)景

穩(wěn)妥對(duì)象,是指沒(méi)有公共屬性,其方法也不引用this的對(duì)象。適合在安全環(huán)境下(這些環(huán)境會(huì)禁止使用this 和 new),或者放置數(shù)據(jù)被其他應(yīng)用程序改動(dòng)時(shí)使用。

穩(wěn)妥函數(shù)與寄生構(gòu)造函數(shù)差異

新創(chuàng)建的對(duì)象的實(shí)例方法不引用this。

不使用new 操作符調(diào)用構(gòu)造函數(shù)。

function Person(name, age, job) {

   var o = new Object();
   //可以在這里定義私有變量和函數(shù)。
   //
   //添加方法
   o.sayName = function(){
       alert(name);
   };
   //返回對(duì)象
   return o;

}

var friend = Person("Nicholas", 29, "software Engineer");
friend.sayName();
以這種模式創(chuàng)建的對(duì)象,除了使用sayName()方法以外,沒(méi)有其他辦法訪問(wèn)name的值。

與計(jì)生構(gòu)造函數(shù)模式類(lèi)似,使用穩(wěn)妥構(gòu)造函數(shù)模式創(chuàng)建的對(duì)象與構(gòu)造函數(shù)之間沒(méi)有什么關(guān)系,因此instanceof操作符對(duì)這種對(duì)象沒(méi)有意義。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86385.html

相關(guān)文章

  • JavaScript高級(jí)程序設(shè)計(jì)學(xué)習(xí)筆記一(JavaScript簡(jiǎn)介)

    摘要:在上百種語(yǔ)言中算是命好的一個(gè),還有就是最近納入高考體系的。由以下三個(gè)部分構(gòu)成。就是對(duì)實(shí)現(xiàn)該標(biāo)準(zhǔn)規(guī)定的各個(gè)方面內(nèi)容的語(yǔ)言的描述。是針對(duì)但經(jīng)過(guò)擴(kuò)展的用于的應(yīng)用程序編程接口。將頁(yè)面映射為由節(jié)點(diǎn)構(gòu)成的樹(shù)狀結(jié)構(gòu)。 JavaScript的歷史這里就不再贅述了,當(dāng)然JavaScript的歷史還是比較有意思的。在上百種語(yǔ)言中JavaScript算是‘命’好的一個(gè),還有就是最近納入高考體系的python...

    supernavy 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)學(xué)習(xí)筆記三(基本語(yǔ)法)

    摘要:數(shù)據(jù)類(lèi)型中有種簡(jiǎn)單數(shù)據(jù)類(lèi)型也稱(chēng)為基本數(shù)據(jù)類(lèi)型和。在中非空字符串,非零數(shù)字,任意對(duì)象,都被認(rèn)為。而空字符串,和,,認(rèn)為是。用于表示整數(shù)和浮點(diǎn)數(shù)。標(biāo)識(shí)符由數(shù)字字母下劃線美元符組成,但首字母不能是數(shù)字。變量方法對(duì)象命名推薦駝峰法。 JavaScript語(yǔ)法 一.語(yǔ)法簡(jiǎn)介 因?yàn)镴avaScript語(yǔ)法和Java等語(yǔ)法非常類(lèi)似。所以只是簡(jiǎn)單介紹一下。 大小寫(xiě) JavaScript是大小寫(xiě)敏感的語(yǔ)...

    Mike617 評(píng)論0 收藏0
  • 《你不知道的javascript筆記_對(duì)象&原型

    摘要:上一篇你不知道的筆記寫(xiě)在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫(xiě)在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)學(xué)習(xí)筆記JavaScript中的事件流和事件處理程序

    摘要:可以使用偵聽(tīng)器或處理程序來(lái)預(yù)訂事件,以便事件發(fā)生時(shí)執(zhí)行相應(yīng)的代碼。響應(yīng)某個(gè)事件的函數(shù)稱(chēng)為事件處理程序或事件偵聽(tīng)器??梢詣h除通過(guò)級(jí)方法指定的事件處理程序。 JavaScript和HTML之間的交互是通過(guò)事件實(shí)現(xiàn)的。 事件:文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬間。 可以使用偵聽(tīng)器(或處理程序來(lái)預(yù)訂事件),以便事件發(fā)生時(shí)執(zhí)行相應(yīng)的代碼。 1. 事件流 事件流:從頁(yè)面中接收事件的順序。 ...

    Rocko 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記] JavaScript 作用域鏈

    摘要:全局執(zhí)行環(huán)境的變量對(duì)象始終是作用域鏈中的最后一個(gè)變量對(duì)象。綜上,每個(gè)函數(shù)對(duì)應(yīng)一個(gè)執(zhí)行環(huán)境,每個(gè)執(zhí)行環(huán)境對(duì)應(yīng)一個(gè)變量對(duì)象,而多個(gè)變量對(duì)象構(gòu)成了作用域鏈,如果當(dāng)前執(zhí)行環(huán)境是函數(shù),那么其活動(dòng)對(duì)象在作用域鏈的前端。 1.幾個(gè)概念 先說(shuō)幾個(gè)概念:函數(shù)、執(zhí)行環(huán)境、變量對(duì)象、作用域鏈、活動(dòng)對(duì)象。這幾個(gè)東東之間有什么關(guān)系呢,往下看~ 函數(shù) 函數(shù)大家都知道,我想說(shuō)的是,js中,在函數(shù)內(nèi)部有兩個(gè)特殊...

    ?xiaoxiao, 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)學(xué)習(xí)筆記之繼承模式

    摘要:實(shí)現(xiàn)原型鏈的方式如下讓原型對(duì)象稱(chēng)為另一個(gè)構(gòu)造函數(shù)的實(shí)例這個(gè)實(shí)例繼承了的屬性上述代碼繼承是通過(guò)來(lái)實(shí)現(xiàn),創(chuàng)建的實(shí)例,并將該實(shí)例賦給。無(wú)疑,集兩者之大成,這才是最常用的繼承模式。 原型鏈 JavaScript的繼承主要依靠原型鏈來(lái)實(shí)現(xiàn)的。我們知道,構(gòu)造函數(shù),原型,和實(shí)例之間的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)原型對(duì)象的指針。 實(shí)現(xiàn)原型鏈...

    suxier 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<