js是函数第一型的语言,在下面使用函数来创建对象。
一、属性
1.私有属性
在函数中,使用var或function声明来维持私有属性(包括普通变量和方法)
2.共有属性
共有属性采用this.attr的形式
3.原型属性
以objName.prototype.attr设置的属性,即在原型对象上添加的属性
4.类属性
objName.attr设置的属性
例子:
function obj(){
var a = 1;
this.b = 2;
function c(){
return 3;
}
this.d = function(){
return 4;
}
}
var o = new obj();
document.write(o.a+" "+o.b+" "+o.c+" "+o.d());
var a = 1;
this.b = 2;
function c(){
return 3;
}
this.d = function(){
return 4;
}
}
var o = new obj();
document.write(o.a+" "+o.b+" "+o.c+" "+o.d());
得到结果: undifined 2 undifined 4
二、继承
1.构造继承
方法:在子类的构造方法中,通过apply或call函数调用父类的构造函数,实现父类属性到子类构造函数中this的复制
function A(){ //父类
this.a = 1;
}
function B(){ //子类
A.apply(this);
}
this.a = 1;
}
function B(){ //子类
A.apply(this);
}
缺点:不能继承原型属性
优点:能够实现多继承,即在子类构造函数中多个父类apply即可;能够解决构造函数带参数的问题
2.原型继承
方法:直接只用对象的prototype属性设置父对象(非父类)
B.prototype = new A();
缺点:修改了子对象的constructor属性;子类构造函数参数传递的问题;只能实现单继承;被迫实例化父类,有很多负作用
3.实例继承
基于的思想:若构造函数的返回值为值类型(没有写return的返回undefined),new只是初始化this传递进来的值;若构造函数返回一个引用类型,则new返回的引用类型所指的对象。
function B(){
var a = new A(); //创建父类实例
a.attr1 = 1; //添加属性
return a;
}
var a = new A(); //创建父类实例
a.attr1 = 1; //添加属性
return a;
}
优点:能够对属性进行扩充
4.clone法
思路:使用自定义的clone把父类的所有属性copy一份(来个深度克隆,包括prototype属性)
function clone(obj){
if(typeof(obj) != "object")return obj;
if(obj == null)return obj;
var newObj = new Object();
for(var i in obj){
newObj[i] = clone(obj[i]);
}
return newObj;
}
if(typeof(obj) != "object")return obj;
if(obj == null)return obj;
var newObj = new Object();
for(var i in obj){
newObj[i] = clone(obj[i]);
}
return newObj;
}