摘要:理解原型對象實例指針構(gòu)造函數(shù)屬性屬性原型對象,在所有支持的實現(xiàn)中,這個方法返回的值。但是重寫整個原型是不行的,因為切斷了構(gòu)造函數(shù)與最初原型的聯(lián)系沒有問題原型對象的問題構(gòu)造函數(shù)指向需要手工寫入對于引用類型來說有共享問題的錯誤
什么是原型模式
使用構(gòu)造函數(shù)的 prototype 屬性來指定那些應該共享的屬性和方法。組合使用構(gòu)造
函數(shù)模式和原型模式時,使用構(gòu)造函數(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理解原型對象
實例(指針)->構(gòu)造函數(shù)constructor屬性->prototype屬性->原型對象
Object.getPrototypeOf() ,在所有支持的實現(xiàn)中,這個
方法返回 [[Prototype]] 的值。
alert(Object.getPrototypeOf(person1) == Person.prototype); //true alert(Object.getPrototypeOf(person1).name); //"Nicholas"
當為對象實例添加一個屬性時,這個屬性就會屏蔽原型對象中保存的同名屬性
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"——來自實例 alert(person2.name); //"Nicholas"——來自原型 delete person1.name; alert(person1.name); //"Nicholas" ——
使用 hasOwnProperty()方法可以檢測一個屬性是存在于實例中,還是存在于原型中。屬性存在于對象實例中時,才會返回 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"——來自實例 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 操作符會在通過對象能夠訪問給定屬性時返回 true ,無論該屬性存在于實例中還是原型中。
結(jié)合使用in和hasPrototypeProperty()可以確定屬性到底是存在對象中還是原型中
function hasPrototypeProperty(object, name){ return !object.hasOwnProperty(name) && (name in object); }更簡單的原型語法
為減少不必要的輸入,也為了從視覺上更好地封裝原型的功能,更常見的做法是用一個包含所有屬性和方法的對象字面量來重寫整個原型對象.
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 });原型的動態(tài)性
由于在原型中查找值的過程是一次搜索,因此我們對原型對象所做的任何修改都能夠立即從實例上反映出來——即使是先創(chuàng)建了實例后修改原型也照樣如此。(但是重寫整個原型是不行的,因為切斷了構(gòu)造函數(shù)與最初原型的聯(lián)系)
var friend = new Person(); Person.prototype.sayHi = function(){ alert("hi"); }; friend.sayHi(); //"hi"(沒有問題!)原型對象的問題
構(gòu)造函數(shù)指向需要手工寫入
對于引用類型來說有共享問題的錯誤
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/96930.html
摘要:在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造函數(shù)和原型構(gòu)造出來的。來看下面的例子優(yōu)點與單純使用構(gòu)造函數(shù)不一樣,原型對象中的方法不會在實例中重新創(chuàng)建一次,節(jié)約內(nèi)存。 我們所熟知的面向?qū)ο笳Z言如 C++、Java 都有類的的概念,類是實例的類型模板,比如Student表示學生這種類型,而不表示任何具體的某個學生,而實例就是根據(jù)這個類型創(chuàng)建的一個具體的對象,比如zhangsan、lisi,由...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態(tài)類型語言的面向接口編程不一而足。對象對他自己的行為負責,其他對象不關(guān)心它的內(nèi)部實現(xiàn)。 ‘工欲善其事,必先利其器’,在深入學習JavaScript之前,我認為我們很有必要了解以下,JavaScript這門面向?qū)ο蟮膭討B(tài)語言到底是一門什么樣的語言。 JavaScript vs 其他面向?qū)ο笳Z言 它沒有使用像Java等傳統(tǒng)的面向?qū)ο笳Z言的類式繼承,而...
摘要:不必在構(gòu)造函數(shù)中定義對象實例的信息。其次,按照一切事物皆對象的這餓極本的面向?qū)ο蟮姆▌t來說,類本身并不是一個對象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個對象。第二個問題就是在創(chuàng)建子類型的實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對象(Object)應該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計中各出沒。寫這篇文章,主要參考與JavaScrip...
摘要:一面向?qū)ο蟾拍蠲嫦驅(qū)ο缶褪鞘褂脤ο?。因此在?gòu)造函數(shù)中表示剛剛創(chuàng)建出來的對象。在構(gòu)造函數(shù)中利用對象的動態(tài)特性為其對象添加成員。 一、面向?qū)ο?1.1 概念 面向?qū)ο缶褪鞘褂脤ο蟆C嫦驅(qū)ο箝_發(fā)就是使用對象開發(fā)。 面向過程就是用過程的方式進行開發(fā)。面向?qū)ο笫菍γ嫦蜻^程的封裝。 1.2 三大特性 抽象性所謂的抽象性就是:如果需要一個對象描述數(shù)據(jù),需要抽取這個對象的核心數(shù)據(jù) 提出需要的核心...
摘要:構(gòu)造函數(shù)模式通過構(gòu)造函數(shù)創(chuàng)建的對象可以通過標識對象類型,通過檢測對象類型。實際上,應該說是沒有辦法在不影響所有對象實例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。 ==什么是對象?==就是無序?qū)傩缘募希ㄟ^屬性或者方法名與值的一一映射。==對象的屬性類型==對象中還定義了一些js中不能直接訪問的屬性,是為了實現(xiàn)js引擎用的。有數(shù)據(jù)屬性和訪問器屬性兩種。1.數(shù)據(jù)屬性數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位...
閱讀 3056·2021-11-16 11:51
閱讀 2664·2021-09-22 15:02
閱讀 3823·2021-08-04 10:21
閱讀 3708·2019-08-30 15:43
閱讀 2015·2019-08-30 11:04
閱讀 3657·2019-08-29 17:14
閱讀 556·2019-08-29 12:16
閱讀 2989·2019-08-28 18:31