js面向?qū)ο?/h2>

面向?qū)ο箐亯|-對(duì)象創(chuàng)建方式總結(jié)

第一種:創(chuàng)建對(duì)象的方式,json方式

//推薦使用的場(chǎng)合: 作為函數(shù)的參數(shù),臨時(shí)只用一次的場(chǎng)景。比如設(shè)置函數(shù)原型對(duì)象。
var obj = {};
//對(duì)象有自己的 屬性 和  行為
// 屬性比如: 年齡、姓名、性別
// 行為: 吃飯、睡覺、走路、講課等... 動(dòng)作
var obj2 = { 
    name: 'laoma', 
    age: 18, 
    sayHi: function(){
        console.log( name + 'say hi' );
    }
};
//添加其他屬性:
obj2.newProp = 123;// js的動(dòng)態(tài)特性,如果沒有要訪問(wèn)的屬性,直接添加屬性。

// 缺點(diǎn): 不能作為對(duì)象創(chuàng)建的模板,也就是不能用new進(jìn)行構(gòu)造新對(duì)象。

//=================================================

第二種: 創(chuàng)建面向?qū)ο蟮姆绞剑?new Object()的方式。 不推薦使用。

var obj3 = new Object();
//添加屬性
obj3.name = 'kitty';
obj3.sayHi = function() {
    console.log( name + ' ' + 'say hi');
};

//跟上面的方式一樣,只能臨時(shí)用一下這個(gè)對(duì)象,不想作為new的構(gòu)造模板是可以的。

第三種: 構(gòu)造函數(shù)構(gòu)造對(duì)象方法

//把 一個(gè)函數(shù)對(duì)象 當(dāng)做構(gòu)造函數(shù)來(lái)使用,一般要把 函數(shù)對(duì)象的首字母大寫
function Person() {
    this.name = '123'; // 通過(guò)this可以直接給 構(gòu)造出來(lái)的對(duì)象添加屬性。
    this.sayHi = function() {
        console.log( this.name );
    };
}   

var p  = new Person(); 
//** new 運(yùn)算符的作用:
// 第一步:
// 執(zhí)行構(gòu)造函數(shù)(new后面的那個(gè)函數(shù)),在構(gòu)
//造函數(shù)內(nèi)部創(chuàng)建一個(gè)空對(duì)象,
// 第二步: 把上面的空對(duì)象跟構(gòu)造函數(shù)的原型對(duì)象進(jìn)行關(guān)聯(lián)。
// 第三步:然后把this 指向當(dāng)前空對(duì)象
//在構(gòu)造函數(shù)執(zhí)行結(jié)束后,把空對(duì)象返回 給 p

console.log( p.name ); //p.name 從構(gòu)造函數(shù)里面創(chuàng)建的。
p.sayHi(); //在此方法內(nèi)部的 this執(zhí)行 p對(duì)象。


//繪制原型 和 構(gòu)造函數(shù) 和對(duì)象之間的關(guān)系。

第三種方式的升級(jí)改造版本:

//第三種方式有個(gè)缺點(diǎn): 對(duì)象的內(nèi)部的函數(shù)會(huì)在每個(gè)對(duì)象中都存一份
//如果創(chuàng)建的對(duì)象非常多的話,那么非常浪費(fèi)內(nèi)存。函數(shù)的行為是所有對(duì)象
//可以共有,不需要每個(gè)對(duì)象都保存一份。所以,可以把函數(shù)放到原型中
//進(jìn)行聲明,那么所有對(duì)象都有了公共的函數(shù),而且內(nèi)存中只保留一份。
//所有的屬性寫到對(duì)象的內(nèi)部
//第三種的升級(jí)版:
function Sprite() {
    this.name = '123';
    this.age = 19;
}
Sprite.prototype = {
    sayHi: function() {

    },
    init: function() {

    }
};

//繼續(xù)升級(jí): 把屬性的設(shè)置做成參數(shù)化:
function Sprite( sname, sage ) {
    this.name  = sname || '';
    this.age = sage || 18;
}

Sprite.prototype = {
    sayHi: function() {

    },
    init: function() {

    }
};

//問(wèn)題: 1、調(diào)用者如果傳遞參數(shù)的順序發(fā)生變化,那么廢了
//問(wèn)題: 2、 參數(shù)增減都會(huì)導(dǎo)致函數(shù)聲明變化,調(diào)用的地方也可能發(fā)生變化。
//如何解決:繼續(xù)升級(jí)
function Sprite( option ) {  //我用一個(gè)對(duì)象把所有參數(shù)覆蓋。靈活性就很強(qiáng)了。
                             //順序無(wú)所謂,添加參數(shù)也無(wú)所謂了。
    this.name  = option.sname || '';
    this.age = option.sage || 18;
}

Sprite.prototype = {
    sayHi: function() {

    },
    init: function() {

    }
};

//繼續(xù)優(yōu)化,把初始化的代碼 放到init函數(shù)中
function Sprite( option ) {  //我用一個(gè)對(duì)象把所有參數(shù)覆蓋。靈活性就很強(qiáng)了。
                             //順序無(wú)所謂,添加參數(shù)也無(wú)所謂了。
    this.init( option );
}
Sprite.prototype = {
    sayHi: function() {

    },
    init: function( option ) {
        this.name  = option.sname || '';
        this.age = option.sage || 18;
    }
};

//以后的canvas課程的開發(fā)暫時(shí)先用這種的方式


補(bǔ)充js方法調(diào)用的四種模式

  • 方法調(diào)用模式
function Person() {
    var name1 = "itcast",
    age1 = 19,
    show1 = function() {
        console.log(this.name);
    };

    return {
        age : age1,
        name : name1,
        show : show1
    };
}

var p = new Person();
p.show();  //在show方法中的this指向了p對(duì)象。
  • 函數(shù)調(diào)用模式
function add( a, b) {
    this.result = a + b;
}

add( 3, 9 ); //此方法執(zhí)行的時(shí)候,this指向了window

console.log(result);    
  • 構(gòu)造器調(diào)用模式
function Person(){
    this.name = "123";
    this.age = 19;
    this.show = function(){
        console.log(this.name);
    };
}

var p = new Person();
p.show();//  在show方法中方法this,指向了p對(duì)象實(shí)例。
  • call 和 apply調(diào)用模式
function add(a,b){
    this.result = a + b;       
}

var p  = {};        //定義一個(gè)空對(duì)象。
add.call(p,3,4);    //在這個(gè)方法調(diào)用的時(shí)候,this指向了p
console.log(p.result);

//apply和call是一樣的用法,只不過(guò)apply第二個(gè)參數(shù)用數(shù)組進(jìn)行傳遞。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容