您的位置:首页 > Web前端 > JavaScript

不用new的方式手动构造JS对象

2016-02-16 16:13 696 查看
首先我们先写一个工厂函数

function Person(name) {
this.name = name
}

Person.prototype.sex = 'male';
Person.prototype.age = 22;


一般来说,我们生成Person对象就用
var p1 = new Person('my name')
的方式。

其实在理解了this上下文,原型链后,我们也可以手工构造一个Person对象,方法如下

function createPerson(name) {
var tmp = {};
tmp.__proto__ = Person.prototype;
var obj = Person.call(tmp, name);
if (typeof obj == 'object') {
return obj;
}
return tmp;
}


运行结果如下:



下面一一介绍每条语句的作用

var tmp = {};


先生成一个空对象,使用
Object.create()
方法也可以

tmp.__proto__ = Person.prototype;


修改原型链

var obj = Person.call(tmp, name);

改变this上下文,执行对象的构造函数,如果是多个参数,可以用
Person.apply(tmp,arguments)
的方式,方便传入不定参数

if (typeof obj == 'object')


如果工厂函数return的是Object类型,则会替换掉当前构造的对象

这里测试一下

function Person(name) {
this.name = name
return new Animal();
}

Person.prototype.sex = 'male';
Person.prototype.age = 22;
var p1 = new Person('cch');

function Animal() {
this.wow = true;
this.claw = true;
}

Animal.prototype.further = 'soft';

console.log(p1);




new Person()
最后返回的是
Animal


这里有更详尽的解释

Js New一个函数和直接调用的区别

参考文献

理解js中的原型链,prototype与proto的关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 对象