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

資訊專欄INFORMATION COLUMN

學(xué)習(xí)筆記:對象,原型和繼承(1)

zhangrxiang / 2000人閱讀

摘要:一創(chuàng)建對象工廠模式構(gòu)造函數(shù)模式和都是的不同實例。寄生構(gòu)造函數(shù)模式不使用和創(chuàng)建要返回的對象可以在這里添加私有變量和函數(shù)添加方法注意,在以這種模式創(chuàng)建的對象中,除了使用方法之外,沒有其他辦法訪問的值

一:創(chuàng)建對象
1 工廠模式

 function createPerson(name, age, jod){
     var obj = new Object();
     obj.name = name;
     obj.age = age;
     obj.job = job;
     obj.sayName = function(){
         console.log(this.name);
     };
     return obj;
 }

 var person1 = createPerson("NEVAR", 23, "Front-end Engineer");
 var person2 = createPerson("Amy", 27, "Doctor");

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

 function Person(name, age, job){
     this.name = name;
     this.age = age;
     this.job = job;
     this.sayName = function(){
         console.log(this.name);
     }
 }

 var person1 = new Person("NEVAR", 23, "Front-end Engineer");
 var person2 = new Person("Amy", 27, "Doctor");
 //person1和person2都是Person的不同實例。
 alert(person1.constructor == Person); //true
 alert(person2.constructor == Person); //true
 //即是Object的實例也是Person的實例
 alert(person1 instanceof Object); //true
 alert(person1 instanceof Person); //true
 //構(gòu)造函數(shù)產(chǎn)生的是兩個不同實例,同名函數(shù)是不相等的
 alert(person1.sayName == person2.sayName); //false

3 原型模式

 function Person(){
 }

 Person.prototype.name = "NEVAR";
 Person.prototype.age = 23;
 Person.prototype.job = "Front-end Engineer";
 Person.prototype.sayName = function(){
     console.log(this.name);
 };

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

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

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

 var person3 = new Person();
 person3.name = "PP";
 console.log(person3.name); //PP 來自實例

 delete person3.name;
 console.log(person3.name); //NEVAR 來自原型

 alert(person1.hasOwnProperty("name")); //false 來自原型
 alert(person3.hasOwnProperty("name")); //true  來自實例

 alert("name" in person1); //true in操作符的使用

 function hasPrototypeProperty (obj, name){
     return !obj.hasOwnProperty(name) && (name in obj)
 }
 //判斷屬性來自實例 真 然后取反 
 //并且name屬性存在于obj原型鏈上 說明這個 屬性是屬于prototype的

 alert(hasPrototypeProperty(person1,"name")) // true
 alert(hasPrototypeProperty(person3,"name")) // false

 alert(Object.keys(Person.prototype)) //"name,age,job,sayName" 
 //Person的可枚舉屬性

不過以上方法太過于麻煩 每次都要寫重復(fù)的prototype

 function Person(){
 }

 Person.prototype = {
     name : "NEVAR",
     age : "23",
     job : "Front-end Engineer",
     sayName : function(){
         console.log(this.name);
     }
 };

constructor 屬性不再指向Person 了 指向Object

var friend = new Person();
 alert(friend instanceof Object); //true
 alert(friend instanceof Person); //true
 alert(friend.constructor == Person); //false
 alert(friend.constructor == Object); //true

于是可以這樣

 Person.prototype = {
     constructor : Person,
     name : "NEVAR",
     age : "23",
     job : "Front-end Engineer",
     sayName : function(){
         console.log(this.name);
     }
 };

原型的動態(tài)性

var friend = new Person();

 Person.prototype.sayHi = function(){
     alert("Hi");
 }
friend.sayHi();//Hi
//這時沒有問題,如果我們重寫原型對象 那么情況就不一樣了
function Person(){
}
var friend = new Person();
Person.prototype = {
constructor: Person,
name : "NEVAR",
age : 23,
job : "Front-end Engineer",
sayName : function () {
alert(this.name);
}
};
friend.sayName(); //error

重寫原型對象切斷了現(xiàn)有原型與任何之前已經(jīng)存在的對象實例之間的聯(lián)系;它們引用的仍然是最初的原型。

原型模式也不是沒有缺點。首先,它省略了為構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實例在默認(rèn)情況下都將取得相同的屬性值

對于那些包含基本值的屬性倒也說得過去,畢竟(如前面的例子所示),通過在實例上添加一個同名屬性,可以隱藏原型中的對應(yīng)屬性。然而,對于包含引用類型值的屬性來說,問題就比較突出了

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

4組合使用構(gòu)造函數(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(){
         console.log(this.name);
     }
 }

 var person1 = new Person("NEVAR", 23, "Front-end Engineer");
 var person2 = new Person("Amy", 27, "Doctor");

 person1.friends.push("Van");

 console.log(person1.friends) //"Shelby,Court,Van"
 console.log(person2.friends) //"Shelby,Court"
 console.log(person1.friends === person2.friends); // false
 console.log(person1.sayName === person2.sayName); //true

5動態(tài)原型模式
它把所有信息都封裝在了構(gòu)造函數(shù)中,而通過在構(gòu)造函數(shù)中初始化原型(僅在必要的情況下),又保持了同時使用構(gòu)造函數(shù)和原型的優(yōu)點。換句話說,可以通過檢查某個應(yīng)該存在的方法是否有效,來決定是否需要初始化原型。

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    if(typeof this.sayName != function){
        Person.prototype.sayName = function(){
            console.log(this.name);
        }
    }
}

 var person1 = new Person("NEVAR", 23, "Front-end Engineer");
 friend.sayName();

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

//不使用this和new
function Person(name, age, job){
    //創(chuàng)建要返回的對象
    var o = new Object();
    //可以在這里添加私有變量和函數(shù)

    //添加方法
    o.sayName = function(){
        console.log(name);
    }
    return o;
}

注意,在以這種模式創(chuàng)建的對象中,除了使用sayName()方法之外,沒有其他辦法訪問name 的值

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

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

相關(guān)文章

  • JavaScript學(xué)習(xí)第十天筆記繼承

    摘要:繼承原型鏈如果構(gòu)造函數(shù)或?qū)ο蟮脑椭赶驑?gòu)造函數(shù)或?qū)ο?,的原型再指向?gòu)造函數(shù)或?qū)ο?,以此類推,最終的構(gòu)造函數(shù)或?qū)ο蟮脑椭赶虻脑汀? 繼承 原型鏈 如果構(gòu)造函數(shù)或?qū)ο驛的原型指向構(gòu)造函數(shù)或?qū)ο驜,B的原型再指向構(gòu)造函數(shù)或?qū)ο驝,以此類推,最終的構(gòu)造函數(shù)或?qū)ο蟮脑椭赶騉bject的原型。由此形成了一條鏈狀結(jié)構(gòu),被稱之為原型鏈。按照上述的描述,在B中定義的屬性或方法,可以在A中使用并不需要...

    baiy 評論0 收藏0
  • JS學(xué)習(xí)筆記(第6章)(實現(xiàn)繼承的幾種方式)

    摘要:使用最多的繼承模式是組合繼承,這種模式使用原型鏈繼承共享的屬性和方法,而借用構(gòu)造函數(shù)繼承實例屬性。原型式繼承,可以在不必預(yù)先定義構(gòu)造函數(shù)的情況下實現(xiàn)繼承,其本質(zhì)是執(zhí)行給定對象的淺復(fù)制。 1、原型鏈實現(xiàn)繼承 function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = func...

    hiyayiji 評論0 收藏0
  • JavaScript學(xué)習(xí)筆記第四天_面向對象編程

    摘要:即另外,注意到構(gòu)造函數(shù)里的屬性,都沒有經(jīng)過進(jìn)行初始化,而是直接使用進(jìn)行綁定。并且在模式下,構(gòu)造函數(shù)沒有使用進(jìn)行調(diào)用,也會導(dǎo)致報錯。調(diào)用構(gòu)造函數(shù)千萬不要忘記寫。 1. 基礎(chǔ) JavaScript不區(qū)分類和實例的概念,而是通過原型來實現(xiàn)面向?qū)ο缶幊?。Java是從高級的抽象上設(shè)計的類和實例,而JavaScript的設(shè)計理念,聽起來就好比Heros里的Peter,可以復(fù)制別人的能力。JavaS...

    weapon 評論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(三)類的使用(中)

    摘要:實際上,可以將其理解為某種形式的繼承。如果上下文是,則使用全局對象代替。例如的第個參數(shù)是上下文,后續(xù)是實際傳入的參數(shù)序列中允許更換上下文是為了共享狀態(tài),尤其是在事件回調(diào)中。 公開記錄學(xué)習(xí)JS MVC,不知道能堅持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。接上一篇類的學(xué)習(xí),發(fā)現(xiàn)實在是看暈了,有些例子是能看懂在干嘛,但是不知道為什么這樣做,有的甚至...

    DandJ 評論0 收藏0
  • JavaScript高級程序設(shè)計學(xué)習(xí)筆記繼承模式

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

    suxier 評論0 收藏0
  • [JavaScript 學(xué)習(xí)筆記] 2. 繼承

    摘要:第二個問題是在創(chuàng)建子類型的實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。實際上,應(yīng)該說是沒有辦法在不影響所有對象實例的情況下,給炒類型的構(gòu)造函數(shù)傳遞參數(shù)。借用構(gòu)造函數(shù)偽造對象或經(jīng)典繼承即在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù)。 繼承 許多 OO 語言支持兩種繼承方式:接口繼承和實現(xiàn)繼承。接口繼承只繼承方法簽名,而實現(xiàn)繼承則繼承實際的方法。如前所述,由于函數(shù)沒有簽名,在 ECMAScri...

    leeon 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<