资讯专栏INFORMATION COLUMN

prototype与__proto__

yanwei / 715人阅读

摘要:对象的属性的方法属性为对象所属的那一类所共有。对象原型链通过属性向上寻找。为指定之外的原始类型值是无效的。构造函数模式的继承如果没有明确指定,通过构造函数创建的对象的属性值为构造函数的属性。

对象的 prototype 属性的方法、属性为对象所属的那一“类”所共有。对象原型链通过 __proto__ 属性向上寻找。
__proto__ 指定 null 之外的原始类型(Number, String, Boolean, undefined, Symbol)值是无效的。
通过构造函数或者 {} 方式创建的对象的 prototype 属性默认为 undefined

{} 的继承
var a = {
  x: 10,
  calculate: function (z) {
    return this.x + this.y + z;
  }
};
 
var b = {
  y: 20,
  __proto__: a
};
 
var c = {
  y: 30,
  __proto__: a
};
 
// call the inherited method
b.calculate(30); // 60
c.calculate(40); // 80

如果没有明确指定,那么 __proto__ 默认为 Object.prototype,而Object.prototype 自身也有 __proto__ ,值为 null,是原型链的终点。

If a prototype is not specified for an object explicitly, then the default value for __proto__ is taken — Object.prototype. Object Object.prototype itself also has a __proto__, which is the final link of a chain and is set to null.

构造函数模式的继承
// a constructor function
function Foo(y) {
  // which may create objects
  // by specified pattern: they have after
  // creation own "y" property
  this.y = y;
}
 
// also "Foo.prototype" stores reference
// to the prototype of newly created objects,
// so we may use it to define shared/inherited
// properties or methods, so the same as in
// previous example we have:
 
// inherited property "x"
Foo.prototype.x = 10;
 
// and inherited method "calculate"
Foo.prototype.calculate = function (z) {
  return this.x + this.y + z;
};
 
// now create our "b" and "c"
// objects using "pattern" Foo
var b = new Foo(20);
var c = new Foo(30);
 
// call the inherited method
b.calculate(30); // 60
c.calculate(40); // 80
 
// let"s show that we reference
// properties we expect
 
console.log(

  b.__proto__ === Foo.prototype, // true
  c.__proto__ === Foo.prototype, // true
 
  // also "Foo.prototype" automatically creates
  // a special property "constructor", which is a
  // reference to the constructor function itself;
  // instances "b" and "c" may found it via
  // delegation and use to check their constructor
 
  b.constructor === Foo, // true
  c.constructor === Foo, // true
  Foo.prototype.constructor === Foo, // true
 
  b.calculate === b.__proto__.calculate, // true
  b.__proto__.calculate === Foo.prototype.calculate // true
  
);

如果没有明确指定,通过构造函数创建的对象的 __proto__ 属性值为构造函数的 prototype 属性。

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

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

相关文章

  • 傻傻分不清的__proto__prototype

    摘要:今天同事小英童鞋问了我一个问题小英童鞋认为的原型对象是,所以会继承的属性,调用相当于调用,但结果不是一个方法。构造函数创建对象实例函数有两个不同的内部方法和。如果不通过关键字调用函数,则执行函数,从而直接执行代码中的函数体。 今天同事小英童鞋问了我一个问题: function Foo(firstName, lastName){ this.firstName = firstNam...

    YancyYe 评论0 收藏0
  • JavaScript中__proto__prototype的关系

    摘要:了解中原型以及原型链只需要记住以下点即可对象都有属性,指向构造函数的构造函数函数都有属性,指向构造函数的原型对象的内置构造函数可知所有的构造函数都继承于甚至包括根构造器及自身。 了解JavaScript中原型以及原型链只需要记住以下2点即可 对象都有__proto__属性,指向构造函数的prototype 构造函数函数都有prototype属性,指向构造函数的原型 1、对象的__p...

    justjavac 评论0 收藏0
  • __proto__prototype的理解

    这篇文章主要 解决的问题 是:什么是__proto__?什么是prototype?他们的关系是什么?在原型链中扮演什么角色? proto和prototype prototype是函数的一个属性,在定义构造函数的时候自动创建,它指向函数的原型,被 __proto__指向。这个原型对象里包含着自定义的方法属性。 __proto__是对象的内部属性,它指向构造器的prototype,对象依赖它来进...

    tommego 评论0 收藏0
  • 【前端芝士树】Javascript的原型原型链

    摘要:在创建对象不论是普通对象还是函数对象的时候,都有一个叫做的内置属性,用于指向创建它的构造函数的原型对象,也就是。因为一个普通对象的构造函数所以原型链原型链的形成是真正是靠而非。参考文章最详尽的原型与原型链终极详解,没有可能是。 【前端芝士树】Javascript的原型、原型链以及继承机制 前端的面试中经常会遇到这个问题,自己也是一直似懂非懂,趁这个机会整理一下 0. 为什么会出现原型和...

    yy736044583 评论0 收藏0
  • 原型链一:原型原型链

    摘要:说白了,原型就是构造函数用来构造新实例的模板对象。什么是原型链先回答什么是原型。例如这个原型的原型就是这个构造函数的,既这个原型对象。这些原型对象通过像链子一样连起来,就叫做原型链。 原型链初步学习 这篇博客只是我初步理解原型链的一个个人学习笔记,写的比较粗略,且有的地方可能理解错误. 更多更专业的关于原型链的解释请看JavaScript深入之从原型到原型链和阮一峰的博客:Javas...

    MudOnTire 评论0 收藏0
  • JS 原型及原型链学习

    摘要:所以继承了对象的所有方法,当你用时,会先查一下它的构造函数的原型对象有没有有方法,没查到的话继续查一下的原型对象有没有这个方法。 普通函数与构造函数的区别 在命名规则上,构造函数一般是首字母大写,普通函数遵照小驼峰式命名法。 在函数调用的时候: function fn() { } 构造函数:1. new fn( ) 2 .构造函数内部会...

    PiscesYE 评论0 收藏0

发表评论

0条评论

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