84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
prototype里面已经没有constructor属性,然后往它的原型对象里面找到constructor属性,为何返回的结果不一样?
学习是最好的投资!
感谢题主提了个好问题,让我自己也总结了一下以前学过的知识点,哈哈,欢迎交流讨论
链接-----推荐王福明里面学习原型的博客
以下是我自己的总结
①每个函数都有一个prototype,每个对象(函数也是对象)都有一个__proto__(隐式原型)
②访问一个对象的属性的时候,如果对象没有该基本属性,则会沿着__proto__链往上查找
③对象的__proto__指向创建该对象的原型prototype
④函数是由Function函数创建,所以函数的__proto__指向Function的prototype,而Function.prototype也是一个对象,她的__proto__指向Object.prototype
⑤自定义函数和自定义对象都由function Object(){}函数创建,Object的prototype也是一个特例,她的__proto__属性指向了null
例如: var p = new Person(); 对象p由Person构造函数创建,所以对象p的__proto__指向Person的prototype
__proto__链(原型链)
对象p的原型链:
p ----> Person.prototype -----> Object.prototype -----> null
函数Person()的原型链:
Person() ----> Function.prototype ----> Object.prototype -----> null
1.console.log(Person.constructor)
Person本身是一个函数,它的__proto__指向Function的prototype,它没有constructor属性(只有Person的prototype才有constructor属性),Person的基本属性没有constructor属性,所以它会沿着__proto__(原型链)往上查找,所以它的__proto__上一级是Function的prototype,而Function的prototype的constructor属性指向下面的结果
结果: function Function(){}
2.console.log(Person.prototype)
由于Person.prototype已经被重置为一个空的对象所以会返回一个对象
结果: Object
但她还是一个对象,所以她还是有__proto__属性,__proto__的上一级是指向Object.prototype,而Object.prototype里面又有如题主图中所示的很多属性
3.console.log(Person.prototype.constructor)
由于Person.prototype已经被重置为一个空的对象,里面没有constructor属性,所以她会往上查找该属性,上面也提到她的__proto__的上一级是指向Object.prototype,而Object.prototype的constructor属性指向function Object(){}
结果: function Object(){}
有时间再写详细一点,欢迎指正错误
Person是一个function,有constructor的:
Person.constructor === Function // true
http://www.jianshu.com/p/dee9...可以参考一下我写的文章
Person.prototype原型对象的construction指向构造函数本身,这个你已经知道了,所以
Person.prototype={}//这时候contruction就指向这个空对象Object了
而构造函数Person本身也有一个construcion,他的constructor指向谁呢?答案就是这个Function,Function自己又有一个constuction,还是指向Function...Function是ECMAScript规定的本地对象
感谢题主提了个好问题,让我自己也总结了一下以前学过的知识点,哈哈,欢迎交流讨论
链接-----推荐王福明里面学习原型的博客
以下是我自己的总结
①每个函数都有一个prototype,每个对象(函数也是对象)都有一个__proto__(隐式原型)
②访问一个对象的属性的时候,如果对象没有该基本属性,则会沿着__proto__链往上查找
③对象的__proto__指向创建该对象的原型prototype
④函数是由Function函数创建,所以函数的__proto__指向Function的prototype,而Function.prototype也是一个对象,她的__proto__指向Object.prototype
⑤自定义函数和自定义对象都由function Object(){}函数创建,Object的prototype也是一个特例,她的__proto__属性指向了null
__proto__链(原型链)
对象p的原型链:
函数Person()的原型链:
1.console.log(Person.constructor)
Person本身是一个函数,它的__proto__指向Function的prototype,它没有constructor属性(只有Person的prototype才有constructor属性),Person的基本属性没有constructor属性,所以它会沿着__proto__(原型链)往上查找,所以它的__proto__上一级是Function的prototype,而Function的prototype的constructor属性指向下面的结果
结果: function Function(){}
2.console.log(Person.prototype)
由于Person.prototype已经被重置为一个空的对象
所以会返回一个对象
结果: Object
但她还是一个对象,所以她还是有__proto__属性,__proto__的上一级是指向Object.prototype,而Object.prototype里面又有如题主图中所示的很多属性
3.console.log(Person.prototype.constructor)
由于Person.prototype已经被重置为一个空的对象,里面没有constructor属性,所以她会往上查找该属性,上面也提到她的__proto__的上一级是指向Object.prototype,而Object.prototype的constructor属性指向function Object(){}
结果: function Object(){}
有时间再写详细一点,欢迎指正错误
Person是一个function,有constructor的:
http://www.jianshu.com/p/dee9...
可以参考一下我写的文章
构造函数Person和他的原型对象Person.prototype都有construction
Person.prototype原型对象的construction指向构造函数本身,这个你已经知道了,所以
而构造函数Person本身也有一个construcion,他的constructor指向谁呢?答案就是这个Function,Function自己又有一个constuction,还是指向Function...Function是ECMAScript规定的本地对象