理解对象属性
面向对象语言的标志是都有类的概念但是js没有类这个概念,因此它的对象和基于类的语言中的对象有所不同。
创建对象的方法:
var person = new Object();
person.name = "sulishi";
ES6简洁方法:允许在对象中只写属性名,不写属性值这个时候属性值就是属性名代表的变量
var foo =‘bar’
var baz = {foo};
属性(property)类型
1.数据属性
·[[Configurable]]:表示能否用delect删除属性或是能否修改属性特性默认值为true
·[[Enumberable]]:能否通过for-in返回属性 默认true
·[[Writable]]:能否修改属性的数据值,默认undefined
·[[Value]]:包含这个属性的数据值默认undefined
要修改属性默认的特性必须用
Object.defineProperty()//vue的数据双向绑定的核心也是这个
IE8是第一个实现object.definpProperty()方法的浏览器,但是有很多bug不建议在这个里面使用
2.访问器属性
·[[Get]]:读取属性时调用的函数 默认undefined·
·[[Set]]:写入属性时调用的函数 默认undefined
访问器属性不能直接定义,必须使用和上面一样的方法
eg:
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
get 和 set不一定非得同时指定getter和setter,只指定getter然意味着属性是不能写的
object.defineProperties()
利用这个方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。
Object.getOwnPropertyDescriptor()
可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有 configurable、enumerable、get 和 set;如果是数据属性,这个对象的属性有 configurable、enumerable、writable 和 value。
工厂模式,构造函数模式
原型模式
1.理解原型对象
只要创建新函数,就会根据特定的规则给该函数创建一个prototype属性,指向函数的原型对象。默认所有原型对象都会自动获得一个constructor属性
实现原型链基本模式
call(),apply()
·call(xx)传递参数进行继承
浅复制,深复制