亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript對象的深入理解(二)

tommego / 445人閱讀

摘要:原型的概念不同于構(gòu)造函數(shù)模式創(chuàng)建對象只能單級即成,得益于原型鏈的概念,原型模式可實現(xiàn)類似其他語言的多級繼承。組合使用構(gòu)造函數(shù)與原型模式單一使用原型對象的問題在于所有屬性皆共享,若不想共享某屬性,則可放入構(gòu)造函數(shù)中。

之前提到,構(gòu)造函數(shù)方法創(chuàng)建對象存在著方法不共享的問題,因此引申出了原型模式創(chuàng)建對象

原型模式

原型模式旨在創(chuàng)建一個模版對象,該對象的所有屬性和方法被其實例所共享。

原型的概念

不同于構(gòu)造函數(shù)模式創(chuàng)建對象只能單級即成,得益于原型鏈的概念,原型模式可實現(xiàn)類似其他OOP語言的多級繼承。

原型鏈:一系列有繼承關(guān)系的函數(shù)(對象)中[[prototype]]屬性自底向上的指向

先給一個例子:

function Person() {
    
}

Person.prototype = {
      constructor: Person,
    name: "Jonathan",
    age: 23,
      job: developer,
      sayName: function() {
        console.log(this.name);
    }
}

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

該例子中各對象的關(guān)系如下

//

每一個函數(shù)(對象)都可以視為一個模版,向上看,該對象的[[prototype]]

創(chuàng)建原型對象
function Person() {
}

Person.prototype = {
      constructor: Person,
    name: "Jonathan",
    age: 23,
      job: developer,
      sayName: function() {
        console.log(this.name);
    }
}

var person1 = new Person();
person1.sayName(); //"Jonathan"

var person2 = new Person();
person2.sayName(); //"Jonathan"

console.log(person1.sayName == person2.sayName); //true

要點

先命名一個空函數(shù)

用對象字面量方式,為該函數(shù)的.prototype屬性添加原型屬性及方法

為了constructor屬性的正確指向,應(yīng)先把constructor指向該對象

原型對象的問題

由于眾多實例共享原型的屬性,因此改變其中某個實例的屬性會影響到全局,造成屬性污染,例子如下:

function Person(){
}

Person.prototype = {
    constructor: Person,
    name : "Nicholas",
    age : 29,
    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);    //"Shelby,Court,Van"
alert(person2.friends);    //"Shelby,Court,Van"
alert(person1.friends === person2.friends);  //true

可見,person1的friends屬性污染了person2的friends屬性。為避免這種情況,引入組合構(gòu)造函數(shù)與原型模式。

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

單一使用原型對象的問題在于所有屬性皆共享,若不想共享某屬性,則可放入構(gòu)造函數(shù)中。

function Person(name, age, job){
   this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ["Boy next door", "Deep dark fantasy"];
}

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

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89459.html

相關(guān)文章

  • 深入理解JavaScript

    摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...

    myeveryheart 評論0 收藏0
  • 由ES規(guī)范學(xué)JavaScript():深入理解“連等賦值”問題

    摘要:有這樣一個熱門問題其實這個問題很好理解,關(guān)鍵要弄清下面兩個知識點引擎對賦值表達式的處理過程賦值運算的右結(jié)合性一賦值表達式形如的表達式稱為賦值表達式。賦值表達式是右結(jié)合的。 有這樣一個熱門問題: var a = {n: 1}; var b = a; a.x = a = {n: 2}; alert(a.x); // --> undefined alert(b.x); // --> {n: ...

    JasonZhang 評論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個接口,可通過...

    tuniutech 評論0 收藏0
  • 深入理解JavaScript執(zhí)行上下文和執(zhí)行棧

    摘要:執(zhí)行上下文和執(zhí)行棧是中關(guān)鍵概念之一,是難點之一。理解執(zhí)行上下文和執(zhí)行棧同樣有助于理解其他的概念如提升機制作用域和閉包等。函數(shù)執(zhí)行完成,函數(shù)的執(zhí)行上下文出棧,并且被銷毀。 前言 如果你是一名 JavaScript 開發(fā)者,或者想要成為一名 JavaScript 開發(fā)者,那么你必須知道 JavaScript 程序內(nèi)部的執(zhí)行機制。執(zhí)行上下文和執(zhí)行棧是JavaScript中關(guān)鍵概念之一,是Ja...

    silenceboy 評論0 收藏0
  • 深入理解JavaScript執(zhí)行上下文和執(zhí)行棧

    摘要:執(zhí)行上下文和執(zhí)行棧是中關(guān)鍵概念之一,是難點之一。理解執(zhí)行上下文和執(zhí)行棧同樣有助于理解其他的概念如提升機制作用域和閉包等。函數(shù)執(zhí)行完成,函數(shù)的執(zhí)行上下文出棧,并且被銷毀。 前言 如果你是一名 JavaScript 開發(fā)者,或者想要成為一名 JavaScript 開發(fā)者,那么你必須知道 JavaScript 程序內(nèi)部的執(zhí)行機制。執(zhí)行上下文和執(zhí)行棧是JavaScript中關(guān)鍵概念之一,是Ja...

    leiyi 評論0 收藏0

發(fā)表評論

0條評論

tommego

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<