国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS對(duì)象之封裝(二)

jasperyang / 1056人閱讀

摘要:對(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

相關(guān)文章

  • JS對(duì)象封裝

    摘要:對(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; } ...

    jk_v1 評(píng)論0 收藏0
  • JS對(duì)象封裝

    摘要:對(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; } ...

    codergarden 評(píng)論0 收藏0
  • JS 設(shè)計(jì)模式封裝

    摘要:閉包實(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è)...

    SunZhaopeng 評(píng)論0 收藏0
  • 你不能不知道的Koa實(shí)現(xiàn)原理

    摘要:前言什么這是一篇源碼解讀文章那一定很枯燥不看。通過利用函數(shù),幫你丟棄回調(diào)函數(shù),并有力地增強(qiáng)錯(cuò)誤處理。并沒有捆綁任何中間件,而是提供了一套優(yōu)雅的方法,幫助您快速而愉快地編寫服務(wù)端應(yīng)用程序。 showImg(https://segmentfault.com/img/bVNQYf?w=1020&h=790); 前言 什么?這是一篇源碼解讀文章 ? 那一定很枯燥!不看。 我把 Koa 的核心實(shí)...

    LinkedME2016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<