资讯专栏INFORMATION COLUMN

对原型链和原型以及构造函数的验证

source / 2620人阅读

摘要:开局先上一张图分清楚函数与对象得到结论对象都有这个属性但是只有函数对象才有这个属性。所有的原型对象都有属性,该属性对应创建所有指向该原型的实例的构造函数。原型链的顶端是。的原型链的上一个节点是本身这个很奇怪哎。

开局先上一张图、分清楚函数与对象:

得到结论:对象都有_proto_这个属性,但是只有函数对象才有prototype这个属性。

得出上面结论后我们再上一张图、我们对话题研究都是基于这张图:

根据上图,自己些代码论证一下得出一下结论:
const Foo =function(){};
const Foo_prototype = Foo.prototype;
const f1 = new Foo();
Foo.prototype == Foo.prototype //true
Foo_prototype.constructor == Foo //true
//1得出结论,Foo是一个函数对象,Foo的原型Foo_prototype的构造函数就是Foo本身
f1.__proto__ == Foo.prototype // true
//2得出结论,foo的实例指向f1的原型链上一个节点也就是Foo的原型
Foo_prototype.__proto__ == Object;//true
//3得出结论,Foo原型指向Foo的上一个原型节点
const Object_prototype = Object.prototype;
Object_prototype.__proto__ == null//true
//4得出结论,Object的原型链上一个节点是null,这也就是万物皆对象,null中生对象
const Function_prototype = Function.prototype;
Object.__proto__ == Function_prototype//true
//5得出结论,原生对象指向Function的原型,
Function.__proto__ == Function_prototype;//true
//6得出结论,Function的原型链的上一个节点是Function本身
Foo.__proto__ == Function_prototype//true
//7得出结论,Foo的原型链上一个节点指向Function

**经过上述代码验证得出如下结论:
1.所有对象都有_proto_这个属性。
2.所有的原型对象都有constructor属性,该属性对应创建所有指向该原型的实例的构造函数。
3.原型链的顶端是null。
**

**4.对象本身的prototype和_proto_毫无关系,_proto_指向原型链上一个节点的原型。
5.Function的原型链的上一个节点是Function本身(这个很奇怪哎)。**
OK,抛出一个问题:

//通常情况下,为了只继承父函数的原型而不继承其他静态方法往往这样定义
b = function(){};
c = function(){};
b.prototype.say = 1;
c.prototype.say = 2;
function extend(father,son){
  var def = function(){};
  def.prototype = father.prototype;
  son.prototype = new def();
}
extend(b,c)

问题:
1.继承的时候可以直接使用son.prototype = father.prototype 吗?
2.为什么要新建一个def函数,然后son继承def的原型来继承呢?
3.通过1方法和2方法生成的son是一样的吗?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93200.html

相关文章

  • JS中原型链和原型认识

    摘要:在上面的各种原型的变换中,其实难点就在于构造函数也是对象原型对象等所有对象都由构造这四个点。 这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很好,今天我以JS为例,探索一下JS不同于其他面向对象的语言的地方-------原型和原型链 首...

    Juven 评论0 收藏0
  • JS中原型链和原型认识

    摘要:在上面的各种原型的变换中,其实难点就在于构造函数也是对象原型对象等所有对象都由构造这四个点。 这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很好,今天我以JS为例,探索一下JS不同于其他面向对象的语言的地方-------原型和原型链 首...

    Shimmer 评论0 收藏0
  • 剖析JS原型链和继承

    摘要:接下来我们来聊一下的原型链继承和类。组合继承为了复用方法,我们使用组合继承的方式,即利用构造函数继承属性,利用原型链继承方法,融合它们的优点,避免缺陷,成为中最常用的继承。 JavaScript是一门面向对象的设计语言,在JS里除了null和undefined,其余一切皆为对象。其中Array/Function/Date/RegExp是Object对象的特殊实例实现,Boolean/N...

    darkerXi 评论0 收藏0
  • ES5原型链和ES6类实现详解

    摘要:类才支持实例属性代码解读上面暂时只是概念性的写法,事实上,的类只是一个原型链的语法糖而已,主要是从写法上更接近于面相对象的类而已,另外一个作用就是区分的构造函数和函数之间的区分。 ES5的原型链和ES6的类实现详解 JavaScript最初设计时受到了面相对象编程的影响,从而引入了new关键字,来实例化对象。而在ES5中new后面跟着的是构造函数(也是函数),而到了ES6则改成了cla...

    王伟廷 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<