问几个有关函数对象和原型链的问题

kstg4703904 2017-01-15 12:34:52
1.

function a(){
this.name = 'a';
}


原文:
当创建一个函数,它会发生什么呢?

第一:它会创建1个函数对象 也就是a 本身。

第二:它会创建1个原型对象@a(用@来表示)。

第三:函数对象会有一个prototype指针,它指向了对应的原型对象,这里就指向了@a。

第四:原型对象中有一个construtor指针,指向它的构造函数,这里就指向了a。


问题:a()既是一个函数对象也是一个构造函数?

2.原文:所有实例里面都会有一个引用_proto_指向了这个原型,而原型对象也有一个_proto_指针,又指向了另一个原型,一个接一个,就形成了原型链。

问题:原型对象的_proto_指针指向了另一个原型,这个“另一个原型”是构造函数吗?如上图所示,所谓的原型链是不是Person.prototype→Person.prototype.constructor→Person?

3.

function a(){
this.name = 'a';
}

function b(){
this.age = 1;
}

b.prototype = new a();
alert(new b().name);
b.prototype =a.prototype;
alert(new b().name);
alert(new b().age);

为什么把new a()赋给b.prototype会让函数b拥有a的属性而不是函数a的属性覆盖函数b的属性?还有new a.prototype返回的是什么?还有b.prototype =a.prototype后,为什么b.prototype没法拥有函数a的name属性?

...全文
175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kstg4703904 2017-01-16
  • 打赏
  • 举报
回复
引用 2 楼 weixin_36771189 的回复:
new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
引用 2 楼 weixin_36771189 的回复:
new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
这么说function a()既是普通函数又是构造函数? "构造函数可以直接()调用,普通函数也可以用new来调用" 构造函数直接用()调用和用new来调用得到的结果相同吗?普通函数用new来调用和直接用()调用得到的结果相同吗? 还有我的第二问中"原型对象也有一个_proto_指针,又指向了另一个原型",这个"另一个原型"究竟是什么?
  • 打赏
  • 举报
回复
引用 4 楼 kstg4703904的回复:
[quote=引用 2 楼 weixin_36771189 的回复:] new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
引用 2 楼 weixin_36771189 的回复:
new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
这么说function a()既是普通函数又是构造函数? "构造函数可以直接()调用,普通函数也可以用new来调用" 构造函数直接用()调用和用new来调用得到的结果相同吗?普通函数用new来调用和直接用()调用得到的结果相同吗? 还有我的第二问中"原型对象也有一个_proto_指针,又指向了另一个原型",这个"另一个原型"究竟是什么?[/quote] 构造函数不用new调用直接用()调用就是普普通通函数走一遍,不管什么函数如果用new来调,就参考上面new做的四件事,然后走一遍函数里面的代码。
  • 打赏
  • 举报
回复
引用 4 楼 kstg4703904的回复:
[quote=引用 2 楼 weixin_36771189 的回复:] new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
引用 2 楼 weixin_36771189 的回复:
new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
这么说function a()既是普通函数又是构造函数? "构造函数可以直接()调用,普通函数也可以用new来调用" 构造函数直接用()调用和用new来调用得到的结果相同吗?普通函数用new来调用和直接用()调用得到的结果相同吗? 还有我的第二问中"原型对象也有一个_proto_指针,又指向了另一个原型",这个"另一个原型"究竟是什么?[/quote] 谁生的他,他的[[proto]]就指向谁,比如,用Fun()new的实例,实例的[[proto]]就指向Fun.prototype,永远如此。推荐你看个文章,在学习对象这块的话,看不懂不要强求,先打基础 http://mp.weixin.qq.com/s/oe5BFjmuPU2YTqBjQZxSyg
aguang 2017-01-16
  • 打赏
  • 举报
回复
问题1: 当用关键字new来调用一个函数时(如 new a()),这个函数就称为构造函数。构造函数与普通函数的区别在于:它是用来创建并初始化一个新对象的。javaScript包含一些内置构造函数,如Array(),Date()....。例 创建一个空数组: var a=new Array(); 构造函数也可以是自定义函数。如用楼主提供的自定义函数a来创建一个新对象: var b=new a(); 问题2: 原型即原型属性,它是一个对象。javaScript的对象都有原型(除null外),另外Object.prototype也没有原型。 所有通过直接量创建的对象都具有同一个原型对象,并可以通过Object.prototype获得对原型对象的引用;如var a={x:1},对象a原型为Object.prototype。 通过new和自定义构造函数创建的对象,如问题1中的b,其原型为构造函数a的prototype属性值。如果在构造函数中自定义了它的原型对象(a.prototype),那么对象b的原型就是a.prototype;否则为Object.prototype。 通过new和内置构造函数(如Array(),Date())创建的对象,如问题1中的a,它的原型为Array.prototype。不过,Array.prototype,Data.prototype等都继承自Object.prototype。像问题1中的对象a的原型Array.prototype及原型Object.prototype构成了“原型链"。 函数也是对象,如楼主提供的函数a。所以函数也有自已的原型----Function.prototype,而Function.prototype同样继承自Object.prototype。
  • 打赏
  • 举报
回复
楼主买本犀牛书和javascript高级程序语言设计先通读2遍吧,js基础最难啃的两块,一作用域链二原型链,这两块决定了你js的高度。
  • 打赏
  • 举报
回复
new 是来调函数的,不要用new去调一个原型(对象)。 一级原型链是指 实例对象=>原型对象 还有你要理解实例的原型就是构造函数的prototype 实例.__proto__==构造函数.prototype返回true
  • 打赏
  • 举报
回复
1.首先,构造函数就是一个函数,不同于普通函数,构造函数用new来调用,(构造函数可以直接()调用,普通函数也可以用new来调用)。 2.用new来调用构造函数总共发生了四件事(细节顺序好像不是特别清楚,不过逻辑上没错) 1创建一个新对象 //var obj={} 2设置obj的原型为构造函数的原型 //obj.__proto__=Fun.prototype 3将构造函数的执行上下文(this)改为新对象 //Fun.call(obj) 4如果构造函数没有返回值,或者返回的不是一个对象,则将新创建的对象返回 //return this ****************** 对于obj1=obj2,这是将obj2的引用赋值给了obj1,

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧