對(duì)象
1、用已學(xué)的知識(shí)來描述一下對(duì)象:
var mrDeng = {
name : "mrDeng",
age: 40,
sex : "male",
health: 100,
smoke: function () {
console.log('I am smoking ! cool!!!!')
mrDeng.health --; //對(duì)象.方法
//屬性值是函數(shù)的話,稱這個(gè)值為方法。
}
}
2、屬性的增、刪、改、查
//增
mrDeng.wife = "xiaoliu"; //對(duì)象.屬性 = 屬性值
//刪
deleten mrDeng.sex
//改
mrDeng.sex = famale;
//查
mrDeng.age
對(duì)象的屬性,沒定義就訪問時(shí)不會(huì)報(bào)錯(cuò),會(huì)返回undefiend。
3、對(duì)象的創(chuàng)建方法
字面量
//var obj = {} plainOblect 對(duì)象字面量/對(duì)象直接量
構(gòu)造函數(shù)
- 系統(tǒng)自帶 new Object();Array();Number();Booleam();String();Date();
var obj = new Object();
var obj = {}; //這兩個(gè)沒有任何區(qū)別
var obj = new Object();
obj.name = 'abc';
obj.sex = 'male'; //添加屬性
//構(gòu)造函數(shù)寫法和真正的函數(shù)沒有什么區(qū)別。
//構(gòu)造函數(shù)的免名稱盡量使用**大駝峰式命名規(guī)則**
- 自定義
function Car(){
this.name = 'BMW';
this.height = '1400';
this.lang= '4900';
this.weight= '1000';
this.health= '100';
this.run= function(){
this.health --;
};
}
var car = new Car();
var car1 = new Car();
- Object.create原型方法
構(gòu)造函數(shù)內(nèi)部原理
1、在函數(shù)體最前面隱式的加上this = {};
2、執(zhí)行this.xxx = xxx;
3、隱式的返回this
function Student(name, age, sex){
//var this = {
// name : "zhangsan",
// age:18
//}
this.name = name;
this.age = age;
this.sex = sex;
this.grade = 2017;
return this;
}
var student = new Student('zhangsan', 18, 'male');
//構(gòu)造函數(shù)必須使用new語句。+++
要注意,如果顯示的添加一個(gè)return,那最后返回的就是這個(gè)return。但是如果返回的是原始值,那是不可以的。
但凡要使用new的話,你可以添加return來搗亂,但你返回的必須是對(duì)象值:數(shù)組、function(){}、對(duì)象都行。但不能返回原始值,因?yàn)槟鉵ew了,你不能返回原始值,如果你返回原始值,系統(tǒng)會(huì)強(qiáng)制忽略掉,然后強(qiáng)制返回該對(duì)象。這是一個(gè)冷門知識(shí)點(diǎn),了解一下就好!
包裝類
1、new Stirng();
2、new Boolean();
3、new Number();
原始值沒有屬性和方法,只有對(duì)象才能有屬性和方法。數(shù)字有正常的原始值數(shù)字和對(duì)象,原始值數(shù)字不能有屬性和方法,對(duì)象是可以有的。原始值通過使用new方法是可以變成對(duì)象的,但是undefined和null不可以有屬性和方法。
//原始值不能有屬性和方法,但是為什么這里還可以加屬性訪問呢?因?yàn)榘b類。
var num = 4;
num.len = 3;
console.log(num.len);
在原始值調(diào)用屬性的時(shí)候,無論是賦值還是查找,它自己不能有,所以這里發(fā)生一個(gè)隱式的轉(zhuǎn)換。new Number(4).len = 3;也就是新建一個(gè)數(shù)字對(duì)象,再讓數(shù)字對(duì)象的len等于3,來彌補(bǔ)你操作的不足。然后這步完成之后就銷毀delete。這個(gè)隱式的包裝環(huán)節(jié)叫做包裝類。
有時(shí)候會(huì)這么考你:
var arr = [1, 2, 3, 4, 5];
console.log(arr.length); //5
arr.length = 2;
console.log(arr); //[1, 2]
length除了可以訪問以外,還可以被賦值。所以這里重新給length賦值的時(shí)候,數(shù)組被截?cái)嗔?。所以基于這個(gè)理論,問你:
var str = "abcd";
str.length = 2;
console.log(str); //這里會(huì)輸出什么?
console.log(str.length); //這里輸出的仍然是4;
字符串自己沒有l(wèi)ength屬性,那只有系統(tǒng)幫你弄一個(gè)。那就new String('abcd').length = 2; 然后這步完成之后就銷毀delete。所以輸出仍然是abcd。
點(diǎn)length (.length)是系統(tǒng)自帶的屬性,字符串本身就有,只不過是對(duì)象字符串才有這個(gè)屬性。訪問點(diǎn)length的話,系統(tǒng)會(huì)new String('abcd').length,而這個(gè)new Srting是有l(wèi)ength屬性的,new Srting的length就是字符串長度4,所以造成一個(gè)錯(cuò)覺,有時(shí)候我們可以直接用
字符串,length 其實(shí)系統(tǒng)拿的是new String的一個(gè)結(jié)果給你拋回來的。所以記住,原始值操作屬性是操作不了的。
看一道題:
var str = "abc";
str += 1; //abc1
var test = typeof(str); //test == "String"
if(test.length == 6){
test.sign = "typeof的返回值結(jié)果可能為String";
//調(diào)用包裝類new Srting(test).sign = 'xxx';
}
//訪問的時(shí)候 new Srting(test).sign;什么都沒有
console.log(test.sign); //undefined
原始值賦屬性值是要調(diào)用包裝類的,但是賦了等于沒賦,包裝完立馬就銷毀,是訪問不了的。
練習(xí):
var x =1,y = z = 0;
function add(n){
rerurn n = n +1;
}
y = add(x);
function add(n){
rerurn n = n +3;
}
z = add(x)
// 1 4 4