javascript继承的写法

时间:2022-05-17 04:58:55

原文链接:http://js8.in/698.html.

构造函数继承:

第一种方法是使用prototype属性:

这里也可以直接Child.prototype=new P();考虑到P构造函数的参数无法确定,所以使用一个空函数。

function extend(Child,Parent){
var F=function(){};
F.prototype=Parent.prototype;
Child.prototype=new F();
Child.prototype.constructor=Child;
}

第二种方法则是属性和方法的拷贝:

function extend(Child,Parent){
var c=Child.prototype;
var p=Parent.prototype;
for(var i in p){
c[i]=p[i];
}
};

对象继承:

其实对象继承包括浅拷贝深度拷贝

浅度拷贝:浅拷贝的对象,其实引用的是同一地址。比如 var a={name:'xiaoqiang'},b={};b=a;b.name='lalala';当我修改了b的时候,a也就发生了改变。

深度拷贝:深度拷贝后的对象,修改任一对象,另一对象都不受影响。

浅拷贝示例:

function lightlyCopy(obj){
var c={};
for(var i in obj){
c[i]=obj[i];
}
return c;
}

使用prototype进行拷贝:

function lightlyCopy(obj){
var F=function(){};
F.prototype=obj;
return new F();
}

深度拷贝:这个。。。

// extends 'from' object with members from 'to'. If 'to' is null, a deep clone of 'from' is returned
function extend(from, to)
{
if (from == null || typeof from != "object") return from;
if (from.constructor != Object && from.constructor != Array) return from;
if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function ||
from.constructor == String || from.constructor == Number || from.constructor == Boolean)
return new from.constructor(from); to = to || new from.constructor(); for (var name in from)
{
to[name] = typeof to[name] == "undefined" ? extend(from[name], null) : to[name];
} return to;
}

以上参考自:http://*.com/questions/122102/most-efficient-way-to-clone-an-object

实际上,若递归的对象是个数组的话,也只能用for in,因为for是无法枚举到数组的属性成员的。比如:

var a=[,,];
a.test='hahahah';
for(var i=,len=a.length;i<len;i++){
console.log(a[i]);//让a.test情何以堪呐
}

jquery中也有extend方法,我们通常在写jquery插件时候就会用到。但是,它的第一个参数默认为false,若设置为true,则是深拷贝。