JavaScript面向?qū)ο缶幊虒崿F(xiàn)模擬
前言
每個對象都是一個功能中心,具有明確分工,可以處理信息,處理信息,發(fā)出信息。面向?qū)ο缶幊叹哂徐`活性、可復(fù)用性、模塊化等好處,適合更多合作完成的大型項目。
1. 構(gòu)造函數(shù)
構(gòu)造函數(shù)的功能是生成對象,生成具有相同結(jié)構(gòu)對象的函數(shù)。Java語言通過類實現(xiàn)面向?qū)ο?對象是類的實例,而Javascript則是通過構(gòu)造函數(shù)作為對象的模板,使用prototype實現(xiàn)繼承。
構(gòu)造函數(shù)的幾個特點
- 構(gòu)造函數(shù)內(nèi)部使用了this關(guān)鍵字作為被生成的對象
- 構(gòu)造函數(shù)配合new 操作符使用
- 構(gòu)造函數(shù)的第一個字符一般大寫用來區(qū)分普通函數(shù)
- 構(gòu)造函數(shù)默認返回一個新對象(this),如果手動返回值是引用數(shù)據(jù)類型會覆蓋默認的返回值
function Person(name ){ this.name = name; }; const jack = new Person('jack'); //Person {name: 'jack'} function Person(name ){ this.name = name; return name; }; const jack = new Person('jack'); //Person {name: 'jack'} function Person(name ){ this.name = name; return ['jack']; }; const jack = new Person('jack'); //['jack']
2. new的過程
- 生成一個新對象綁定給this
- 將新對象的原型設(shè)置為構(gòu)造函數(shù)的prototype屬性
- 執(zhí)行代碼,往this上添加屬性
- 返回this
2.1 基礎(chǔ)使用
function Person(name ){ this.name = name; }; const jack = new Person('jack'); const tom = new Person('tom'); console.log(jack); //Person {name: 'jack'} console.log(tom); //Person {name: 'tom'}
直接執(zhí)行構(gòu)造函數(shù)會怎么樣?
function Person(){ this.name = name; }; const jack = Person('jack'); //undefined
構(gòu)造函數(shù)的this指向了window,并沒有返回一個對象,我們現(xiàn)在做以下兼容:
function Person(name){ if(!(this instanceof Person)){ return new Person(name); }; this.name = name; };
現(xiàn)在可以直接使用了
Person(name); //Object { name: "jack" }
2.2 new.target
在函數(shù)內(nèi)部都可以使用new.target,如果函數(shù)是通過new.target調(diào)用的則返回被調(diào)用的構(gòu)造函數(shù)否則返回undefined
function Person(){ console.log(new.target); }; new Person(); //function Person(){...} Person(); //undefined
現(xiàn)在使用new.target進行構(gòu)造函數(shù)的兼容
function Person(name){ if(!(new.target === Person)){ return new Person(name); }; this.name = name; }; console.log(Person('jack')); //Object { name: "jack" }
3. 手動實現(xiàn)一個構(gòu)造函數(shù)
function myNew() { const args = Array.prototype.slice.call(arguments); const construct = args.shift(); //創(chuàng)建this,并將原型設(shè)置為構(gòu)造函數(shù)的prototype const context = Object.create(construct.prototype); //執(zhí)行構(gòu)造函數(shù),注意這里參數(shù)是數(shù)組形式所以使用apply construct.apply(context, args); //返回 const res = construct(); if ((typeof res === 'object' || res === 'function') && typeof res !== 'null') { return res; } { return context; } }; function Person(name, age) { this.name = name; this.age = age; }; const jack = myNew(Person, 'jack', 21); //Person {name: 'jack', age: 21}
到此這篇關(guān)于JavaScript面向?qū)ο缶幊虒崿F(xiàn)模擬的文章就介紹到這了,更多相關(guān)JS面向?qū)ο髢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
- 什么是函數(shù)式編程?根據(jù)百度百科的描述,“函數(shù)式編程是種編程典范,它將電腦運算視為函數(shù)的計算。函數(shù)編程語言最重要的基礎(chǔ)是 λ 演算(lambda calculus)。而且λ演算的函數(shù)可以接受函數(shù)當作輸入(參數(shù))和輸出(返回值)?!?/div> 2015-10-10
javascript 自動標記來自搜索結(jié)果頁的關(guān)鍵字
使用javascript自動標記來自搜索結(jié)果頁的關(guān)鍵字的實現(xiàn)代碼。2010-01-01最新評論