摘要:構(gòu)造函數(shù)就是一個(gè)具有屬性的方法,該屬性被稱作標(biāo)識(shí)具有一個(gè)屬性,但是沒有用戶定義它。然而,構(gòu)造函數(shù)的屬性可以被改變,并且將影響用這個(gè)原型創(chuàng)建的對(duì)象。
原文地址:http://dailyjs.com/2012/05/20/js101-prototype/
在花費(fèi)了很多年研究面向?qū)ο缶幊讨?,想在javascript使用是令人失望的。主要是從根源上缺少一個(gè)class這樣的關(guān)鍵詞。然而,javascript的設(shè)計(jì)不會(huì)成為阻礙 -- 精通它基于原型的繼承,將會(huì)加深你對(duì)該語言的理解。
首先我們需要弄清楚面向?qū)ο笈c面向類編程的區(qū)別。Javascript提供了我們需要的工具來完成大多數(shù)語言的類可以做的事情 -- 我們只需要學(xué)習(xí)如何正確使用它。
我們簡單的看一下prototype屬性,看它如何深化我們對(duì)javascript的了解。
prototype屬性(The prototype Property)prototype屬性是一個(gè)內(nèi)部屬性,它被用于實(shí)現(xiàn)繼承。我們這里的“繼承”是一種特定的繼承形式。因?yàn)闋顟B(tài)和方法都由對(duì)象承載,所以我們可以說結(jié)構(gòu)、行為和狀態(tài)都是繼承的。這與基于類的語言形成對(duì)比,其狀態(tài)由實(shí)例承載,而方法由類承載。
構(gòu)造函數(shù)就是一個(gè)具有屬性的方法,該屬性被稱作prototype:
function Animal() { } console.log(Animal.prototype);
{}標(biāo)識(shí)Animal具有一個(gè)prototype屬性,但是沒有用戶定義它。我們可以隨意添加值和方法:
function Animal() { } Animal.prototype.type = "Unknown"; Animal.prototype.weight = 0; Animal.prototype.weightUnits = "kg"; Animal.prototype.toString = function() { return this.type + ", " + this.weight + this.weightUnits; }; var molly = new Animal(); molly.type = "Dog"; molly.weight = 28; console.log(molly.toString()); // Dog, 28kg
這將會(huì)輸出"Dog, 28kg"。我們可以使用對(duì)象字面量將這些賦值分組:
function Animal() { } Animal.prototype = { type: "Unknown", weight: 0, weightUnits: "kg", toString: function() { return this.type + ", " + this.weight + this.weightUnits; } };
這樣就和你熟悉的類的方式差異不是很大。
動(dòng)態(tài)原型(Dynamic Prototypes)通過指定值可以給對(duì)象動(dòng)態(tài)的添加屬性。
var molly = new Animal() , harley = new Animal(); molly.type = "Dog"; molly.weight = 28; harley.type = "Dog"; harley.weight = 38; harley.name = "Harley"; console.log(molly); console.log(harley); // { type: "Dog", weight: 28 } // { type: "Dog", weight: 38, name: "Harley" }
在這里添加name屬性只影響了實(shí)例。然而,構(gòu)造函數(shù)的屬性可以被改變,并且將影響用這個(gè)原型創(chuàng)建的對(duì)象。
Animal.prototype.weightUnits = "oz"; console.log(molly.toString()) // Now displays "Dog, 28oz"
這就是為什么人們只會(huì)擴(kuò)展自己的庫而不去改變內(nèi)置原型,或者說只有這么做才是安全的。我們完全有可能改變對(duì)象,例如使用String的內(nèi)置方法做一些不安全的事情:
String.prototype.match = function() { return true; }; console.log("alex".match(/1234/));
輸出為true,所以現(xiàn)在我成功的破壞了很多程序都在依賴的基礎(chǔ)方法。
改變內(nèi)置原型也不一定全部是壞的;我們使用它有用的東西,如修補(bǔ)支持更舊版本的ECMAScript在舊版的瀏覽器。
如果我們替換prototype屬性會(huì)發(fā)生什么?
var molly = new Animal() , harley; molly.type = "Dog"; molly.weight = 28; Animal.prototype = { toString: function() { return "..."; } }; harley = new Animal; harley.type = "Dog"; harley.weight = 38; console.log(molly.toString()); console.log(harley.toString()); // Dog, 28kg // ...
盡管事實(shí)上改變原型會(huì)影響所有實(shí)例,但是完全替換構(gòu)造函數(shù)的原型不會(huì)影響舊實(shí)例。為什么?實(shí)例具有對(duì)原型的引用,而不是離散拷貝。想象它就是這樣:使用new關(guān)鍵字創(chuàng)建的每個(gè)實(shí)例都鏈接到原始原型。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91359.html
摘要:使用原型模式添加方法和屬性在前面的章節(jié)中,已經(jīng)學(xué)習(xí)過了如何定義一個(gè)構(gòu)建新對(duì)象時(shí)使用的構(gòu)造函數(shù)。向構(gòu)造函數(shù)的中添加方法和屬性是在對(duì)象被創(chuàng)建的時(shí)候?yàn)閷?duì)象添加功能的另一種方式。讓我們繼續(xù)使用對(duì)象作為構(gòu)造函數(shù)的原型屬性。 本文原文來源:《Object-Oriented JavaScript》By Stoyan Stefanov本文翻譯來源:赤石俊哉 原創(chuàng)翻譯版權(quán)申明: 如果您是原文的原作者并且...
摘要:提及的精髓,閉包作用域鏈函數(shù)是當(dāng)之無愧的。博客的標(biāo)題是中的陷阱的最全收集沒有之一,很顯然這篇博客闡述的是。這是造成很多不熟悉的人深陷陷阱的根源。你應(yīng)該避免在構(gòu)造函數(shù)里面返回任何東西,因?yàn)檫@可能代 當(dāng)有人問起你JavaScript有什么特點(diǎn)的時(shí)候,你可能立馬就想到了單線程、事件驅(qū)動(dòng)、面向?qū)ο蟮纫欢言~語,但是如果真的讓你解釋一下這些概念,可能真解釋不清楚。有句話這么說:如果你不能向一個(gè)6歲...
摘要:而這個(gè)秒就能理解的代碼片段,摒棄了許多不必要的代碼,只實(shí)現(xiàn)了最核心的部分,不像和那樣,考慮參數(shù)邊界值問題,例如,參數(shù)的類型是否符合預(yù)期等。使用根據(jù)斷言函數(shù)對(duì)數(shù)組進(jìn)行過濾,返回條件為真值的對(duì)象。 之前翻譯過一篇文章,《我喜歡的5個(gè)編程技巧》,里面的一個(gè)技巧是借鑒一個(gè)網(wǎng)站的代碼片段,好奇的小手點(diǎn)下鏈接后,發(fā)現(xiàn)是一個(gè)有 47000 多star的倉庫,30-seconds-of-code。 倉...
摘要:翻譯正文第一次聲明變量時(shí),請(qǐng)不要忘記使用關(guān)鍵字聲明使用代替空字符串轉(zhuǎn)成布爾值都為每行代碼的末尾最好都加上個(gè)分號(hào)最好給對(duì)象都添加上構(gòu)造函數(shù)在使用和盡量小心。 翻譯介紹 翻譯標(biāo)題:45 Useful JavaScript Tips, Tricks and Best Practices 翻譯來源:http://modernweb.com/2013/12/23/45-useful-java...
摘要:不幸的是,這種方法在中失效,因?yàn)樗麄儚闹绣e(cuò)誤的去掉了第一個(gè)空成員。假設(shè)競走的比賽結(jié)果需要保存到數(shù)組中。目的就是將競賽者與他們的記錄時(shí)間交替的放在數(shù)組中。結(jié)論我希望我列出的這幾條應(yīng)用足以說明與是最佳搭檔。 原文地址:http://javascriptweblog.wordpress.com/2010/11/08/javascripts-dream-team-in-praise-of-sp...
閱讀 1813·2021-11-22 09:34
閱讀 3097·2019-08-30 15:55
閱讀 676·2019-08-30 15:53
閱讀 2067·2019-08-30 15:52
閱讀 3009·2019-08-29 18:32
閱讀 1999·2019-08-29 17:15
閱讀 2405·2019-08-29 13:14
閱讀 3566·2019-08-28 18:05