摘要:對(duì)象封裝的常用方式常規(guī)封裝升級(jí)版較常見的執(zhí)行原理解釋說明通過構(gòu)造一個(gè)空對(duì)象將構(gòu)造函數(shù)的原型屬性賦值給的原型對(duì)象在執(zhí)行這句話的時(shí)候,對(duì)象就可以在其原型對(duì)象中查找方法。
JS 對(duì)象封裝的常用方式
1.常規(guī)封裝
function Person (name,age){ this.name = name; this.age = age; } Pserson.prototype = { constructor:Person, say:function(){ console.log("hello everyone!"); } }
2.升級(jí)版 (較常見)
function Person (example){ this._init_(example); } Pserson.prototype = { constructor : Person, _init_ : function(example) { this.name = example.name; this.age = example.age; } say:function(){ console.log("hello everyone"); } }
3.new 的執(zhí)行原理
var myNew = function(constructor, args) { var obj = {}; obj .__proto__ = constructor.prototype; var res = constructor.apply(obj , args); var type = typeof res; if (["string", "number", "boolean", "null", "undefined"].indexOf(type) !== -1) { return obj ; } return res; }
解釋說明: 通過var obj = {} 構(gòu)造一個(gè)空對(duì)象. 將構(gòu)造函數(shù)的原型屬性prototype賦值給obj 的原型對(duì)象__proto__
,在執(zhí)行 this.init(example); 這句話的時(shí)候,對(duì)象 obj 就可以在其原型對(duì)象中查找_init_ 方法。(原型鏈)。
var res = constructor.apply(obj,args);
以obj為上下文調(diào)用函數(shù),同時(shí)將參數(shù)作為數(shù)組傳遞。那么,
this._init_(example);
就會(huì)被 obj 執(zhí)行
函數(shù)
_init_ : function(example) { this.name = example.name; this.age = example.age; }
以 obj 為上下文調(diào)用,o也將擁有自己的 name,age屬性。
如果在構(gòu)造函數(shù)中,return 復(fù)合類型,包括對(duì)象,函數(shù),和正則表達(dá)式,那么就會(huì)直接返回這個(gè)對(duì)象,否則,返回 obj
var type = typeof res;
if(["string","number","boolean","null","undefined"].indexOf(type) !== -1){ return obj; } return res;
舉例
function Person(name) { this.name = name; } Person.prototype.say = function() { console.log(this.name); } var jack = myFriend(Person, ["jack "]); console.log(jack ); jack.say();
4.類jQuery 封裝
jQuery 對(duì)象具有很強(qiáng)的集成性,可以作為函數(shù)調(diào)用,也可以做為對(duì)象調(diào)用,當(dāng)作為函數(shù)調(diào)用的時(shí)候,可以無(wú)需 new 而返回一個(gè)實(shí)例。
代碼
var Person = function(info){ return new Person.prototype.init(info); } Person.prototype = { constructor: Person, init:function(){ this.name = example.name. } } Person.prototype.init.prototype = Person.prototype;
這種封裝方式非常巧妙。 將對(duì)象的構(gòu)造操作放在函數(shù)的里面,而自己充當(dāng)一個(gè)工廠。 不斷調(diào)用 prototype 并不是一個(gè)直觀的做法,于是
var Person = function(example){ return new Person.fn.init(example); } Person.fn = Person.prototype = { constructor: Person, init:function(){ this.name = info.name; this.say = function(){ this.makeExp(); } } makeExp:function(){ console.log(this.name); } }
// 雖然把makeArray 等常用方法掛載到 Person.prorotype 下面,但還是會(huì)被 init 這個(gè)實(shí)例使用.
Person.fn.init.prototype = Person.fn;
最后用 閉包 封裝起來
var Person = (function(win) { var Person = function(name) { return new Person.fn.init(name); } Person.fn = Person.prototype = { constructor: Person, init: function(name) { this.name = name; this.say = function() { this.makeExp(); } }, makeExp: function() { console.log(this.name); } } Person.fn.init.prototype = Person.fn; return Person; })()
舉例:
var people = Person("jack"); console.log(people); people.say();
object.create();
一種構(gòu)造對(duì)象的方式, 可以傳遞一個(gè)對(duì)象Person,構(gòu)造一個(gè)people,并且使people 繼承Person.
var Person = { name: "jack", say: function() { console.log(this.name); } } var people = Object.create(Person); console.log(people); people.say();
對(duì)象Person的屬性成為了people的原型屬性,也就是說 people 原型繼承自 Person !
我們可以實(shí)現(xiàn)一個(gè) Object.create()
Object.create = function(prototype){ function Fun(){}; Fun.prototype = prototype; var obj = new Fun(); return obj; }
說明:
將 Person 作為 構(gòu)造函數(shù)的 原型屬性,就可以構(gòu)造出 以Person 為原型對(duì)象的對(duì)象.
Object.create(原型); 創(chuàng)建一個(gè)繼承該原型的實(shí)例對(duì)象
關(guān)于此方法的一些注意事項(xiàng):
(1)若傳參為Object.prototype,則創(chuàng)建的原型為Object.prototype,
和 new Object()創(chuàng)建的對(duì)象是一樣的 Object.create(Object.prototype) <==>new
Object();
(2)若傳參為空 或者 null,則創(chuàng)建的對(duì)象是沒有原型的,
導(dǎo)致該對(duì)象是無(wú)法用document.write()打印會(huì)報(bào)錯(cuò),
因?yàn)閐ocument.write()打印的原理是調(diào)用Object.prototype.toString()方法,
該對(duì)象沒有原型,也就沒有該方法,所以document.write()無(wú)法打印
由此延伸的知識(shí)點(diǎn): 引用值都也是算作是對(duì)象, 所以都可以用document.write()打印; 原始值numebr, boolean, string都有自己對(duì)象的包裝類, 借助此機(jī)制也是可以用document.write()打印出的;
但undefined 和 null既不是引用值,也沒有對(duì)應(yīng)的包裝類, 所以應(yīng)該無(wú)法打印的,但大家會(huì)發(fā)現(xiàn)這兩個(gè)值也是可是用document.write()打印的, 因?yàn)檫@兩個(gè)值被設(shè)定為特殊值,document.write()打印其是不用調(diào)用任何方法的,而是之直接打印其值
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/95036.html
摘要:對(duì)象封裝的常用方式常規(guī)封裝升級(jí)版較常見的執(zhí)行原理解釋說明通過構(gòu)造一個(gè)空對(duì)象將構(gòu)造函數(shù)的原型屬性賦值給的原型對(duì)象在執(zhí)行這句話的時(shí)候,對(duì)象就可以在其原型對(duì)象中查找方法。 JS 對(duì)象封裝的常用方式 1.常規(guī)封裝 function Person (name,age){ this.name = name; this.age = age; } ...
摘要:對(duì)象封裝的常用方式常規(guī)封裝升級(jí)版較常見的執(zhí)行原理解釋說明通過構(gòu)造一個(gè)空對(duì)象將構(gòu)造函數(shù)的原型屬性賦值給的原型對(duì)象在執(zhí)行這句話的時(shí)候,對(duì)象就可以在其原型對(duì)象中查找方法。 JS 對(duì)象封裝的常用方式 1.常規(guī)封裝 function Person (name,age){ this.name = name; this.age = age; } ...
摘要:閉包實(shí)現(xiàn)封裝類靜態(tài)變量靜態(tài)方法正整數(shù)私有屬性年齡不是一個(gè)正整數(shù)一個(gè)只能創(chuàng)建個(gè)人測(cè)試靜態(tài)變量測(cè)試封裝效果測(cè)試靜態(tài)函數(shù)主要參考設(shè)計(jì)模式的例子總結(jié)可以看到這樣實(shí)現(xiàn)了封裝效果。 什么是封裝 封裝就是把一個(gè)對(duì)象保護(hù)起來,使其只提供定義的接口方法,而保護(hù)私有的變量。打個(gè)比方,游戲中的一個(gè)人物對(duì)象,它的經(jīng)驗(yàn)只有通過打死怪獸這個(gè)接口方法來增加。如果可以直接修改經(jīng)驗(yàn)就會(huì)直接影響到整個(gè)游戲的設(shè)定。所以這個(gè)...
摘要:前言什么這是一篇源碼解讀文章那一定很枯燥不看。通過利用函數(shù),幫你丟棄回調(diào)函數(shù),并有力地增強(qiáng)錯(cuò)誤處理。并沒有捆綁任何中間件,而是提供了一套優(yōu)雅的方法,幫助您快速而愉快地編寫服務(wù)端應(yīng)用程序。 showImg(https://segmentfault.com/img/bVNQYf?w=1020&h=790); 前言 什么?這是一篇源碼解讀文章 ? 那一定很枯燥!不看。 我把 Koa 的核心實(shí)...
閱讀 1973·2023-04-25 15:45
閱讀 1213·2021-09-29 09:34
閱讀 2502·2021-09-03 10:30
閱讀 2007·2019-08-30 15:56
閱讀 1463·2019-08-29 15:31
閱讀 1271·2019-08-29 15:29
閱讀 3203·2019-08-29 11:24
閱讀 3056·2019-08-26 13:45