javascript是基于原型继承的,允许对象继承另一个对象的属性.正确的使用它能减少对象初始化时消耗的时间和内存.
引用
js中对象通过引用来传递.通过=
操作符赋值时它们永远不会被复制.
var a = {}, b = {}, c = {};
//a,b和c每个都引用一个不同的空对象
a = b = c = {};
//a,b和c都引用同一个对象
1.创建对象
1.1对象字面量
对象字面量提供了一种非常方便创建新对象值的方法.一个对象字面量就是包围在一对{}
.
var obj = {
name:"object literate"; //添加属性和方法
getName:function(){
return this.name; //在方法中this指向本对象
}
};
obj.getName();//object literate
1.2通过原型创建
每个对象都连接到一个原型对象,并且它可以从中继承属性.所有通过对象字面量创建的对象都连接到
Object.prototype
.
当你创建一个新对象时,你可以选择某个对象作为它的原型.创建一个使用原对象作为其原型的新对象.
if(typeof Object.create !== "function"){
Object.create = function(obj){
function F(){};
F.prototype = obj;
return new F();
}
}
var aa = {
name:"aa"
}
var bb = Object.create(aa);
1.3通过构造函数
如果在一个函数前面带上new来调用,那么会自动创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到那个对象上.
那么使用function怎么解决类型识别问题呢,每个function实例对象都会有一个constructor属性指向其构造函数,
这个属性就可以指示其构造是谁,也可以使用instanceof 操作符来做判断对象是否为该构造函数的实例。
var Person = function(str){
this.name = str;
this.getName = function(){
return this.name;
}
}
var person1 = new Person("js");
console.log(person1.constructor==Person);//true
console.log(person1 instanceof Person); //true
当使用者没有通过new关键字直接调用时,this会绑定到global对象或者windows对象,可能会发生非常糟糕的事情,即没有编译时警告,也没有运行时警告,所以大写约定非常重要.
var Person = function(name){
if(!(this instanceof Person)) return new Person(name);
this.name = name;
this.getName = function(){
return this.name;
}
}
1.4原型和构造函数
var person2 = new Person("c++");
console.log(person1.getName === person2.getName);//false
#方法内容虽然相同,但每个实例没有共享方法,浪费内存.
#通过new来调用函数,创建的新对象会连接到该函数的prototype对象
var Person = function(name){
if(!(this instanceof Person)) return new Person(name);
this.name = name;
}
Person.getName = function(){
return this.name;
}
1.5函数化
通过构造函数创建的对象属性都是公有的,没法保护隐私.
我们可以通过闭包来完成隐藏属性,因为外部作用域没法访问内部作用域,而内部作用域可以访问外部作用域.
var person = function(name){
var value = "closure"
return {
get_name:function(){
return name ? name : "confused";
},
get_value:function(){
return value;
}
}
}
var aa = person("amazed");
aa.get_name();