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;
}