摘要:使用構(gòu)造器有個嚴(yán)重的危害,如果在調(diào)用構(gòu)造器函數(shù)的時候忘記使用前綴,不僅不會綁定到新對象,還會污染全局變量原型模式原型模式中,我們采用對象來繼承。
構(gòu)造器調(diào)用模式
當(dāng)一個函數(shù)對象被創(chuàng)建時,F(xiàn)unction構(gòu)造器會運(yùn)行類似這樣的代碼:
this.prototype = {constructor: this}
new一個函數(shù)事會發(fā)生:
Function.method("new", function() { // 創(chuàng)建新對象,繼承原型 let that = Object.create(this.prototype); // 調(diào)用構(gòu)造函數(shù),綁定this到新對象 let res = this.apply(that, arguments); return typeof res === "object" && res || that; });偽類繼承
let Mammal = function(name) { this.name = name; } Mammal.prototype.get_name = function() { return this.name; } // 構(gòu)造一個實(shí)例 let myMammal = new Mammal("zhangsan"); // 利用偽類繼承Mammal let Cat = function(name) { this.name = name; this.age = age; } Cat.prototype = new Mammal(); Cat.prototype.get_age = function() { return this.age; } let myCat = new Cat("miao");
以上就是一個簡單的偽類繼承。使用構(gòu)造器有個嚴(yán)重的危害,如果在調(diào)用構(gòu)造器函數(shù)的時候忘記使用new前綴,this不僅不會綁定到新對象,還會污染全局變量;
原型模式原型模式中,我們采用對象來繼承。
let myMammal = { name: "aa", age: 22, get_name: function() { return this.name; } } let myCat = Object.create(myMammal); Cat.get_age = function() { return this.age; }
這種繼承方式,導(dǎo)致沒有私有屬性和私有函數(shù)
函數(shù)化模式它的每一層都是在擴(kuò)充that
Function.prototype.method = function (name,func) { this.prototype[name] = func; return this; } // 工廠mammal函數(shù) var mammal = function (spec) { var that = {}; that.get_name = function () { return spec.name; } that.says = function (spec) { return spec.saying || ""; } return that; } // 工廠cat函數(shù)(基于mammal的函數(shù)) var cat = function (spec) { spec.saying = spec.saying || "meow"; // 直接調(diào)用mammal函數(shù) var that = mammal(spec); that.purr = function (n) { var i, s = ""; for (i = 0; i < n; i += 1) { if(s) { s += "-"; } s += "r"; } } that.get_name = function () { return that.says() + " " + spec.name + " " + that.says(); } return that; } // 創(chuàng)建myCat對象 var myCat = cat({name: "Henrietta"}); Object.method("superior",function (name) { var that = this, method = that[name]; return function () { return method.apply(that, arguments) } }) // 工廠coolcat函數(shù)(基于cat函數(shù)) var coolcat = function (spec) { var that = cat(spec), super_get_name = that.superior("get_name"); that.get_name = function (n) { return "like " + super_get_name() + " baby"; } return that; } var myCoolCat = coolcat({name : "Bix"}); var name = myCoolCat.get_name();部件
沒看懂。。
let eventuality = function(that) { let registry = {}; that.fire = function(event) { let array, func, handler, i, type = typeof event === "string" ? event : event.type; if (registry.hasOwnProperty(type)) { array = registry[type]; for(i = 0; i < array.length; i++) { handler = array[i]; func = handler.method; if (typeof func === "string") { func = this[func]; } func.apply(this, handler.parameters || [events]); } } return this; } that.on = function(type, method, parameters) { let handler= { method, parameters }; if (registry.hasOwnProperty(type)) { registry[type].push(handler); } else { registry[type] = [handler]; } return this; } return that; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104668.html
摘要:語言精粹讀書筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個超級延遲綁定使得函數(shù)對高度復(fù)用。構(gòu)造器調(diào)用模式一個函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來調(diào)用,那它就被稱為構(gòu)造器構(gòu)造。 《JavaScript 語言精粹》 讀書筆記 第四章 函數(shù) Functions 函數(shù)字面量 函數(shù)字面量包含4個部分: 第一部分, 保留字 function...
摘要:對象被傳遞到從句中被捕獲。一些語言提供了尾遞歸優(yōu)化。這意味著如果一個函數(shù)返回自身遞歸調(diào)用的結(jié)果,那么調(diào)用的過程會被替換為一個循環(huán),可以顯著提高速度。構(gòu)建一個帶尾遞歸的函數(shù)。語言精粹讀書筆記函數(shù) 第四章 函數(shù) Functions (二) 參數(shù) arguments arguments數(shù)組: 函數(shù)可以通過此參數(shù)訪問所有它被調(diào)用時傳遞給它的參數(shù)列表,包括哪些沒有被分配給函數(shù)聲明時定義的形式參數(shù)...
摘要:于是我就先把這本薄的經(jīng)典書語言精粹修訂版豆瓣讀書本書簡介總共章,除去附錄,才頁,讀完并記錄了一些筆記。讀書筆記還可以分享給別人看。編程語言第版定義了的標(biāo)準(zhǔn)。程序檢查時丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說到怎么學(xué)習(xí)JavaScript,那就是看書、分析源碼。10本書讀2遍的好處,應(yīng)該大于一本書讀20遍。看書主動學(xué)習(xí),看視頻是被動學(xué)習(xí)。看...
摘要:第條盡量少使用全局對象避免聲明全局變量盡量聲明局部變量避免對全局變量增加屬性第條始終聲明局部變量第條避免使用語句第條熟練使用閉包的函數(shù)值包含了比調(diào)用他們時執(zhí)行所需要的代碼還要更多的信息。那些在其所涵蓋的作用域內(nèi)跟蹤變量的函數(shù)稱為閉包。 書還沒看完。一遍看,一遍寫讀書筆記。 這本書的序是JavaScript之父Brendan Eich寫的,作者是JavaScript標(biāo)準(zhǔn)化委員會專家。可想...
摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個函數(shù)時,函數(shù)執(zhí)行的方式會改變。對象包含構(gòu)造器需要構(gòu)造一個新的實(shí)例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。 JavaScript 是一門弱類型語言,從不需要類型轉(zhuǎn)換。對象繼承關(guān)系變得無關(guān)緊要。對于一個對象來說重要的時它能夠做什么,而不是它從哪里來。 閱讀《javascript語言精粹》筆記! 偽類 js的原型存...
閱讀 1670·2021-10-13 09:39
閱讀 2099·2021-09-07 10:20
閱讀 2678·2019-08-30 15:56
閱讀 2945·2019-08-30 15:56
閱讀 932·2019-08-30 15:55
閱讀 625·2019-08-30 15:46
閱讀 3494·2019-08-30 15:44
閱讀 2552·2019-08-30 11:15