浅复制
var person = {
name:"zhu",
say:function(){
console.log(this.name);
}
}
//person 为xiao的原型对象
var xiao = Object.create(person);
深拷贝
function deepCopy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else { c[i] = p[i]; }
}return c;
}
工厂模式:
是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可
例子:
function xyy(name){
var obj = new Object();
obj.name =name;
obj.show = function(){
alert(this.name);
}
return obj;
}
var obj = xyy('abc');
构造函数
function xyy(name){
this.name = name;
this.show = function(){
alert(this,name);
}
}
var obj = new xyy('abc');
构造函数和工厂模式的差别:
函数名首写字母为大写
(虽然标准没有严格规定首写字母为大写,但按照惯例,构造函数的首写字母用大写)
没有显示的创建对象
直接将属性和方法赋值给了this对象
没有return语句
使用new创建对象
能够识别对象(这正是构造函数模式胜于工厂模式的地方)
构造函数的缺点:
使用构造函数的最大的问题在于每次创建实例的时候都要重新创建一次方法(理论上每次创建对象的时候对象的属性均不同,而对象的方法是相同的),然而创建两次完全相同的方法是没有必要的,也浪费内存。
原型模型:
我们创建的每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。使用原型对象的好处就是可以让所有对象实例共享它所包含的属性及方法。
例子:
function xyy(name){
this.name = name;
}
xyy.prototype.show = function(){
alert(this.name);
}
例子2:构造函数和原型模型的组合
//构造函数
function xyy(name,age,add){
this.name = name;
this.age=age;
this.add=add;
}
xyy.prototype={
//constructor属性,指向它们的构造函数。
constructor:xyy,
say:function(){
console.log(this.name);
}
name:hahaha,
age:20,
}
var xiao =new xyy('xyy',21,''sz');
delete xiao.name;
console.log(xiao.name);
//hasOwnProperty() 方法用来判断某个对象是否含有指定的自身属性。
console.log(xiao.hasOwnProperty);
var zou = new Person('zou',20,'GZ');
console.log(zou.hasOwnProperty("name"));
网友评论