摘要:理解原型對(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
摘要:在基于原型的面向?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,由...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態(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言的類式繼承,而...
摘要:不必在構(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...
摘要:一面向?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ù) 提出需要的核心...
摘要:構(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ù)值的位...
閱讀 3011·2021-11-16 11:51
閱讀 2634·2021-09-22 15:02
閱讀 3756·2021-08-04 10:21
閱讀 3670·2019-08-30 15:43
閱讀 1977·2019-08-30 11:04
閱讀 3624·2019-08-29 17:14
閱讀 516·2019-08-29 12:16
閱讀 2961·2019-08-28 18:31