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());
得到结果: undifined 2 undifined 4
二、继承
1.构造继承
方法:在子类的构造方法中,通过apply或call函数调用父类的构造函数,实现父类属性到子类构造函数中this的复制
function A(){ // 父类 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; }
优点:能够对属性进行扩充
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;}