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

来源:互联网 发布:淘宝新店铺怎么上货 编辑:程序博客网 时间:2024/06/04 23:28

首先我们先写一个工厂函数

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的关系

0 0
原创粉丝点击