资讯专栏INFORMATION COLUMN

原型与原型链学习笔记

jiekechoo / 2616人阅读

摘要:原型相同对象的共有属性也称作原型原型链中所有的对象都是由它的原型对象继承而来。说的直白点就是,所有原型链的属性,最终都指向的是对象的而对象的指向的是。

原 型:相同对象的共有属性也称作原型

原型链:中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链

在JS中,不同类型对象都有各自相同类型共有的属性,也有全部对象共有的属性,如果每个对象的属性都多带带出来,会非常浪费资源,

var a = new String("a");
var b = new Number(1);
var c = new Boolean(true);
//可以发现,不管是字符串还是数值还是布尔,它们都有toString()属性
a.toString
ƒ toString() { [native code] }

b.toString
ƒ toString() { [native code] }

c.toString
ƒ toString() { [native code] }

所以JS将公共的属性多带带出来【如全部对象共用属性valueOf() ,toString()】,JS通过__proto__ 来指向每个类型对象的公共属性。比如,有五个string对象五个number对象,每个对象的值都是不同的,但对象类型都是一样的。

var a = new Number(1)
var b = new Number(2)
//虽然变量a和b的值不同,但是它们共有的属性都是__proto__: Number
console.log(a)
Number {1}
__proto__: Number
[[PrimitiveValue]]: 1

console.log(b)
Number {2}
__proto__: Number
[[PrimitiveValue]]: 2



string对象和number对象都有自己私有属性(指相同对象类型的私有属性),每个对象的__proto__都指向自己相同对象类型的私有属性,相同对象类型的私有属性也有自己的__proto__,它指向的是全部对象共有的属性。__proto__: Number下面的__proto__又指向了全部对象共有的属性。

全部对象共有的属性,没有__proto__属性,它指向的是null,通过下面截图看出普通的object对象__proto__下的属性已经没有__proto__指到其他地方了。

说的直白点就是,所有原型链的__proto__属性,最终都指向的是object对象的__proto__而object对象的__proto__指向的是null。

var 对象 = new 函数()
对象.__proto__ === 对象的构造函数.prototype


// 推论
var number = new Number()
number.__proto__ = Number.prototype

var object = new Object()
object.__proto__ = Object.prototype

var function = new Function()
function.__proto__ = Function.prototype

// 另外,所有函数都是由 Function 构造出来的,所以
Number.__proto__ = Function.prototype // 因为 Number 是函数,是 Function 的实例
Object.__proto__ = Function.prototype // 因为 Object 是函数,是 Function 的实例
Function.__proto__ == Function.prototye // 因为 Function 是函数,是 Function 的实例!

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

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

相关文章

  • JavaScript学习第十天笔记(继承)

    摘要:继承原型链如果构造函数或对象的原型指向构造函数或对象,的原型再指向构造函数或对象,以此类推,最终的构造函数或对象的原型指向的原型。 继承 原型链 如果构造函数或对象A的原型指向构造函数或对象B,B的原型再指向构造函数或对象C,以此类推,最终的构造函数或对象的原型指向Object的原型。由此形成了一条链状结构,被称之为原型链。按照上述的描述,在B中定义的属性或方法,可以在A中使用并不需要...

    baiy 评论0 收藏0
  • JS学习笔记(第6章)(面向对象之继承——JS继承的六大方式)

    摘要:除此之外,在超类型的原型中定义的方法,对子类型而言也是不可兼得,结果所有类型都只能用构造函数模式。创建对象增强对象指定对象继承属性这个例子的高效率体现在它只调用了一次构造函数。 1、原型链 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。构造函数、原型和实例的关系:每个构造函数都有一个原型对象;原型对象都包含着一个指向构造函数的指针;实例都包含一个指向原型对象的...

    lscho 评论0 收藏0
  • JavaScript高级程序设计学习笔记之继承模式

    摘要:实现原型链的方式如下让原型对象称为另一个构造函数的实例这个实例继承了的属性上述代码继承是通过来实现,创建的实例,并将该实例赋给。无疑,集两者之大成,这才是最常用的继承模式。 原型链 JavaScript的继承主要依靠原型链来实现的。我们知道,构造函数,原型,和实例之间的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。 实现原型链...

    suxier 评论0 收藏0
  • [学习笔记] 小角度看JS原型

    摘要:虽然在脚本中没有标准的方式访问,但在每个对象上都支持一个属性,用于访问其构造函数的原型对象。说的是构造函数和原型对象之间的关系,说的是实例对象和原型对象之间的关系。 前言 在 segmentfault 上看到这样一道题目: var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = fu...

    Cciradih 评论0 收藏0
  • JS学习笔记(第6章)(实现继承的几种方式)

    摘要:使用最多的继承模式是组合继承,这种模式使用原型链继承共享的属性和方法,而借用构造函数继承实例属性。原型式继承,可以在不必预先定义构造函数的情况下实现继承,其本质是执行给定对象的浅复制。 1、原型链实现继承 function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = func...

    hiyayiji 评论0 收藏0

发表评论

0条评论

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