面向?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)用的四種模式
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ì)象。
function add( a, b) {
this.result = a + b;
}
add( 3, 9 ); //此方法執(zhí)行的時(shí)候,this指向了window
console.log(result);
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í)例。
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)行傳遞。
最后編輯于 :2017.12.04 13:04:20
?著作權(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ù)。