关于js的一道题(大佬勿笑)

首先说说我最近遇到的神奇代码:

Function.prototype.a="a";

Object.prototype.b="b";

function Person(){}

var p=new Person();

console.log("Person.a:"+Person.a+" Person.b:"+Person.b);//Person.a:a Person.b:b

console.log("p.a:"+p.a+" p.b:"+p.b);//p.a:undefined p.b:b

让我们先从构造函数开始吧!

构造函数是怎么构建一个实例对象的呢?这里我放上大神的代码,

构造函数的四个步骤:

var obj  ={};//创建一个对象

obj.__proto__ = CO.prototype;//obj对象的隐式原型指向构造函数的原型(为什么说隐式原型呢,因为只有函数才有prototype属性)

CO.call(obj);//将构造函数作用域赋值给obj对象

return obj;//将obj对象返回

解释上面部分代码(var p=new Person()):就是创建了一个具有Person作用域的对象p,此时p的隐式原型指向Person原型。

往下面走,先分析为什么Person.a=”a”和Person.b=”b”,首先function Person()其实就是创建了一个Function实例,所以Person.a=”a”,而Person.prototype是一个原型对象,是一个Object实例,所以Person.b=”b”;

而为什么p.a=undefined而p.b=”b”呢?如果上面构造函数的四个步骤可以懂,其实就很好理解了,首先,p是一个对象,是Object的一个实例,所以它拥有b属性,但是它并不是Function实例,所以不具备a属性。

如果有哪里解释不对的,望您指正。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,721评论 0 21
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,733评论 0 13
  • title: js面向对象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618阅读 3,754评论 0 2
  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 6,490评论 0 6
  • 不一会飞机起飞了,维希一会就睡着了。米达看着她就像看着自己的新婚妻子一样。“看什么呢?”希尔说。“没什么。”...
    27315涵阅读 1,112评论 0 0

友情链接更多精彩内容