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

資訊專欄INFORMATION COLUMN

js面向?qū)ο?原型模式

warmcheng / 3376人閱讀

摘要:理解原型對(duì)象實(shí)例指針構(gòu)造函數(shù)屬性屬性原型對(duì)象,在所有支持的實(shí)現(xiàn)中,這個(gè)方法返回的值。但是重寫整個(gè)原型是不行的,因?yàn)榍袛嗔藰?gòu)造函數(shù)與最初原型的聯(lián)系沒有問題原型對(duì)象的問題構(gòu)造函數(shù)指向需要手工寫入對(duì)于引用類型來說有共享問題的錯(cuò)誤

什么是原型模式

使用構(gòu)造函數(shù)的 prototype 屬性來指定那些應(yīng)該共享的屬性和方法。組合使用構(gòu)造
函數(shù)模式和原型模式時(shí),使用構(gòu)造函數(shù)定義實(shí)例屬性,而使用原型定義共享的屬性和方法。

function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
理解原型對(duì)象

實(shí)例(指針)->構(gòu)造函數(shù)constructor屬性->prototype屬性->原型對(duì)象

Object.getPrototypeOf() ,在所有支持的實(shí)現(xiàn)中,這個(gè)

方法返回 [[Prototype]] 的值。

alert(Object.getPrototypeOf(person1) == Person.prototype); //true
alert(Object.getPrototypeOf(person1).name); //"Nicholas"

當(dāng)為對(duì)象實(shí)例添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中保存的同名屬性

function Person(){
}
Person.prototype.name = "Nicholas";
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 = "Greg";
alert(person1.name); //"Greg"——來自實(shí)例
alert(person2.name); //"Nicholas"——來自原型
delete person1.name;
alert(person1.name); //"Nicholas" ——

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

function Person() {
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function () {
    alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
alert(person1.hasOwnProperty("name")); //false
person1.name = "Greg";
alert(person1.name); //"Greg"——來自實(shí)例
alert(person1.hasOwnProperty("name")); //true
alert(person2.name); //"Nicholas"——來自原型
alert(person2.hasOwnProperty("name")); //false
delete person1.name;
alert(person1.name); //"Nicholas"——來自原型
alert(person1.hasOwnProperty("name")); //false
原型與in操作符

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

結(jié)合使用in和hasPrototypeProperty()可以確定屬性到底是存在對(duì)象中還是原型中

function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
}
更簡(jiǎn)單的原型語法

為減少不必要的輸入,也為了從視覺上更好地封裝原型的功能,更常見的做法是用一個(gè)包含所有屬性和方法的對(duì)象字面量來重寫整個(gè)原型對(duì)象.

function Person() {
}
Person.prototype = {
    name: "Nicholas",
    age: 29,
    job: "Software Engineer",
    sayName: function () {
        alert(this.name);
    }
};
// 重設(shè)構(gòu)造函數(shù),只適用于 ECMAScript 5  兼容的瀏覽器
Object.defineProperty(Person.prototype, "constructor", {
    enumerable: false,
    value: Person
});
原型的動(dòng)態(tài)性

由于在原型中查找值的過程是一次搜索,因此我們對(duì)原型對(duì)象所做的任何修改都能夠立即從實(shí)例上反映出來——即使是先創(chuàng)建了實(shí)例后修改原型也照樣如此。(但是重寫整個(gè)原型是不行的,因?yàn)榍袛嗔藰?gòu)造函數(shù)與最初原型的聯(lián)系)

var friend = new Person();
Person.prototype.sayHi = function(){
alert("hi");
};
friend.sayHi(); //"hi"(沒有問題!)
原型對(duì)象的問題

構(gòu)造函數(shù)指向需要手工寫入

對(duì)于引用類型來說有共享問題的錯(cuò)誤

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

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

相關(guān)文章

  • JS面向對(duì)象編程之封裝

    摘要:在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造函數(shù)和原型構(gòu)造出來的。來看下面的例子優(yōu)點(diǎn)與單純使用構(gòu)造函數(shù)不一樣,原型對(duì)象中的方法不會(huì)在實(shí)例中重新創(chuàng)建一次,節(jié)約內(nèi)存。 我們所熟知的面向?qū)ο笳Z言如 C++、Java 都有類的的概念,類是實(shí)例的類型模板,比如Student表示學(xué)生這種類型,而不表示任何具體的某個(gè)學(xué)生,而實(shí)例就是根據(jù)這個(gè)類型創(chuàng)建的一個(gè)具體的對(duì)象,比如zhangsan、lisi,由...

    YFan 評(píng)論0 收藏0
  • 面向對(duì)象的JavaScript(如何一步步成為js高手)

    摘要:雖然,也是面向疾苦的語言,但是,它和靜態(tài)類型語言的面向接口編程不一而足。對(duì)象對(duì)他自己的行為負(fù)責(zé),其他對(duì)象不關(guān)心它的內(nèi)部實(shí)現(xiàn)。 ‘工欲善其事,必先利其器’,在深入學(xué)習(xí)JavaScript之前,我認(rèn)為我們很有必要了解以下,JavaScript這門面向?qū)ο蟮膭?dòng)態(tài)語言到底是一門什么樣的語言。 JavaScript vs 其他面向?qū)ο笳Z言 它沒有使用像Java等傳統(tǒng)的面向?qū)ο笳Z言的類式繼承,而...

    peixn 評(píng)論0 收藏0
  • 淺談JavaScript面向對(duì)象

    摘要:不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息。其次,按照一切事物皆對(duì)象的這餓極本的面向?qū)ο蟮姆▌t來說,類本身并不是一個(gè)對(duì)象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個(gè)對(duì)象。第二個(gè)問題就是在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對(duì)象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計(jì)中各出沒。寫這篇文章,主要參考與JavaScrip...

    cyixlq 評(píng)論0 收藏0
  • JavaScript面向對(duì)象核心知識(shí)歸納

    摘要:一面向?qū)ο蟾拍蠲嫦驅(qū)ο缶褪鞘褂脤?duì)象。因此在構(gòu)造函數(shù)中表示剛剛創(chuàng)建出來的對(duì)象。在構(gòu)造函數(shù)中利用對(duì)象的動(dòng)態(tài)特性為其對(duì)象添加成員。 一、面向?qū)ο?1.1 概念 面向?qū)ο缶褪鞘褂脤?duì)象。面向?qū)ο箝_發(fā)就是使用對(duì)象開發(fā)。 面向過程就是用過程的方式進(jìn)行開發(fā)。面向?qū)ο笫菍?duì)面向過程的封裝。 1.2 三大特性 抽象性所謂的抽象性就是:如果需要一個(gè)對(duì)象描述數(shù)據(jù),需要抽取這個(gè)對(duì)象的核心數(shù)據(jù) 提出需要的核心...

    TalkingData 評(píng)論0 收藏0
  • js面向對(duì)象編程

    摘要:構(gòu)造函數(shù)模式通過構(gòu)造函數(shù)創(chuàng)建的對(duì)象可以通過標(biāo)識(shí)對(duì)象類型,通過檢測(cè)對(duì)象類型。實(shí)際上,應(yīng)該說是沒有辦法在不影響所有對(duì)象實(shí)例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。 ==什么是對(duì)象?==就是無序?qū)傩缘募?,通過屬性或者方法名與值的一一映射。==對(duì)象的屬性類型==對(duì)象中還定義了一些js中不能直接訪問的屬性,是為了實(shí)現(xiàn)js引擎用的。有數(shù)據(jù)屬性和訪問器屬性兩種。1.數(shù)據(jù)屬性數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位...

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

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

0條評(píng)論

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