《JavaScript设计模式与开发实践》——JavaScript中使用new关键字创建对象实例

首先

  • JS中的对象都具有__proto__属性
  • Function是特殊的对象,除了拥有__proto__属性,还有特有的属性——原型属性(prototype),这个属性是一个指针,指向一个对象,而这个对象的用途包含可以由特定类型的所有实例共享的属性和方法

举个例子:

function Person( name ){
	this.name = name;
};
Person.prototype.getName = function(){
	return this.name;
};
var p1 = new Person('Amy');
console.log(p1.name); // 输出:"Amy"
console.log(p1.getName());  // 输出:"Amy"
console.log( Object.getPrototypeOf( p1 ) === Person.prototype ); // 输出: true

由以上例子可以看出:

  1. 实例 p1 可以访问到构造函数 Person 里的属性
  2. 实例 p1 访问到 Person.prototype 中的属性

下图为对象之间的关系:
new关键字创建对象实例

模拟new关键字创建对象(这段代码来自《JavaScript设计模式与开发实践》):

var objectFactory = function() {
    var obj = new Object();                          /** 从 Object.prototype 上克隆一个空的对象 **/
    var Constructor = [].shift.call(arguments);      /** 取得外部传入的构造器,本例中为 Person **/
    /**
    让 obj.__proto__ 指向 Person.prototype, 取代原来的 Object.prototype 
    **/
    obj.__proto__ = Constructor.prototype;  
    var ret = Constructor.apply(obj, arguments);     /** 借用外部传入的构造器给 obj 设置属性 **/
    return typeof ret === 'object' ? ret : obj;      /** 确保构造器总是会返回一个对象 **/
};
var a = objectFactory( Person, 'Alex' );
console.log( a.name ); // 输出: Alex
console.log( a.getName() ); // 输出: Alex
console.log( Object.getPrototypeOf( a ) === Person.prototype ); // 输出: true
  1. 用new Object() 的方式新建了一个对象 obj (此时obj原型指向Object.prototype);
  2. 取出第一个参数,就是我们要传入的构造函数(本例中为 Person)。此外因为 shift会修改原数组,所以 arguments 会被去除第一个参数;
  3. 将 obj 的原型指向构造函数(Person.prototype),这样 obj就可以访问到构造函数原型中的属性;
  4. 使用 apply,改变构造函数 this 的指向到新建的对象(这样 obj就可以访问到构造函数中的属性),给 obj 设置属性;
  5. 返回 obj,并确保构造器总是会返回一个对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值