用new实例化一个对象时,this指针的绑定--读《JavaScript语言精粹》P47疑惑
迷茫
迷茫 2017-04-10 17:40:21
[JavaScript讨论组]

书本上说当用new操作符实例化一个对象时,大致流程可能是这样的

Function.method('new', function() {
  // 创建一个新对象, 它继承自构造器的原型对象
  var that = Object.create(this.prototype);
  // 调用构造器函数,绑定 -this- 到新对象上
  var other = this.apply(that, arguments);
  // 如果它返回的不一个对象,就返回该新对象
  return (typeof other === 'object' && other) || that; 
})

这段代码有两处疑惑

1、关于this的指向:

书中讲到 “使用构造器函数存在一个严重的危害,如果你在调用构造器函数时忘记了在前面加new前缀,那么this将不会绑定到一个新对象上。而是 全局对象。”

很明显,上述new方法的第二段代码就是讲this绑定到新对象上,那么第二行代码的this哪里来的?它原先指向哪里?
难道这里的this是指向Function的?那么也就是说新对象的this指向它父类的构造函数?

2、最后一行代码,为什么要这么写?难道还存在other不是对象的情况吗?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
高洛峰

1、关于this指向:

答案是:

Function.method('new', function() {
// this指向Function对象
// that是构造器对象
var that = Object.create(this.prototype);
// other是调用构造器之后生成的对象,跟这行代码一个意思: var other = new Person()
var other = this.apply(that, arguments);
// 如果它返回的不一个对象,就返回该新对象
return (typeof other === 'object' && other) || that; 
})

2、最后一行代码,为什么要这么写?难道还存在other不是对象的情况吗?

答案是:存在。具体来说,构造函数也是函数,也是可以在里面return值的,如果return的值是对象类型,那么使用new调用这个构造器的话,返回值就是这样return的对象,但是,如果你return的值是一个基本类型,那么就会忽略这个返回值

function Person(name,age){
  this.name = name
  this.age = age
  return [1,2,3]
}

var p = new Person('taurus_wood', 20) // [1, 2, 3]

function Person2(name,age){
  this.name = name
  this.age = age
  return 1
}

var p2 = new Person2('taurus_wood', 20) // {name:'taurus_wood', age: 20}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号