澳门葡京官网:理解JavaScript的原型属性,对JavaScript中的静态属性和原型属性的理解

澳门葡京官网:理解JavaScript的原型属性,对JavaScript中的静态属性和原型属性的理解。知晓JavaScript的原型属性

2016/06/21 · JavaScript
· 2 评论 ·
原型

本文由 伯乐在线 –
alvendarthy
翻译,sunshinebuel
校稿。未经许可,禁止转发!
英文出处:bytearcher。欢迎出席翻译组。

理解 JavaScript
prototype品质不太简单。你或者知道它同面向对象编制程序(OOP)和对象继承有关,但不见得对其技术原理10分清楚。

一.原型接二连三

  面向对象编制程序能够透过广大途径落成。别的的言语,比如
Java,使用基于类的模型完结: 类及对象实例差别对待。但在 JavaScript
中平昔不类的概念,取而代之的是成套皆对象。JavaScript
中的继承通过原型继承实现:二个指标直接从另1对象继承。对象中包蕴其继承体系中祖先的引用——对象的
prototype 属性。

第叁是在走访上的分别,当访问实例对象的某部属性但它自个儿并未有时,它就会到原型中去寻觅,但不会去寻觅静态属性。

JavaScript中是绝非类的定义的,有的只是原型和对象。

原型继承

面向对象编制程序能够由此众多路径达成。其余的言语,比如
Java,使用基于类的模型完结: 类及对象实例分化对待。但在 JavaScript
中从未类的定义,取而代之的是1切皆对象。JavaScript
中的继承通过原型继承完毕:一个对象直接从另一对象继承。对象中隐含其继承种类中祖先的引用——对象的 prototype 属性。

class 关键字是在 ES陆 中第二遍引进 JavaScript
的。其实,它并不曾为面向对象继承引入新模型, class
关键字通过语法糖,达成了本文介绍的原型个性和构造函数。

贰. JavaScript 完毕三番五次的语言特征

  • 当尝试访问 JavaScript
    对象中不设有的性质时,解析器会查找相配的目的原型。例如调用
    car.toString(),假设 car 未有 toString 方法,就会调用 car
    对象的原型。 那一个查找进度会直接递归,
    直到找寻到相当的原型只怕继承链尽头。

  • 调用  new Car()
    会制造两个新的对象,并开始化为 Car.prototype。
    那样就允许为新对象设置原型链。要求留意的是,new Car() 唯有当  Car 是函数时才有含义。
    此类函数即所谓构造函数

  • 调用对象的三个成员函数时, this
    的值被绑定为当下指标。例如调用 “abc”.toString(),this 的值棉被服装置为
    “abc”,然后调用 toString 函数。该技术帮衬代码重用:同样的代码,可在
    this
    为各类差别的值时调用。对象的成员函数,也被号称对象的点子。

   澳门葡京官网 1

  首先,大家定义构造函数 Rectangle。
依照正规,大家大写构造函数名首字母,申明它能够用 new
调用,以示与任何常规函数的分别。构造函数自动将 this
赋值为一空对象,然后代码中用 x 和 y 属性填充它,以备后用。然后,
Rectangle.prototype 新增一个通过 x 和 y 属性计算周长成员函数。 注意 this
的行使,在分歧的目的中,this
会有例外的值,这几个代码都足以健康工作。最终, 二个名称为 rect
的对象创立出来了。 它一而再了 Rectangle.prototype, 大家能够调用
rect.perimeter(), 然后将结果打字与印刷到控制台。

// 实例对象不会去查找静态属性
function Foo(){}
Foo.a = 1;
var foo = new Foo();
foo.a // undefined

// 当实例对象没有某个属性时,会尝试去原型中查找
function Foo(){}
Foo.prototype.a = 1;
var foo = new Foo();
foo.a // 1

在说原型在此以前先说说JavaScript中目的的叁类别型:

JavaScript 达成两次三番的言语特色

以下语言特色共同落到实处了 JavaScript 继承。

  • 当尝试访问 JavaScript
    对象中不存在的属性时,解析器会查找相配的靶子原型。例如调用 car.toString(),如果
    car 没有 toString 方法,就会调用 car 对象的原型。
    那几个查找进度会一向递归, 直到找寻到十分的原型大概继承链尽头。
  • 调用  new Car() 会成立一个新的靶子,并早先化为 Car.prototype
    那样就同意为新对象设置原型链。供给小心的是,new Car()
    只有当  Car 是函数时才有含义。 此类函数即所谓构造函数。
  • 调用对象的1个成员函数时, this
    的值被绑定为当前目的。例如调用 "abc".toString()this
    的值被设置为 "abc",然后调用 toString
    函数。该技术帮助代码重用:同样的代码,可在 this
    为各样分化的值时调用。对象的成员函数,也被称之为对象的点子。

prototype 属性名称带来的误解

  有局地有关 JavaScript 的原型的误解。
贰个对象的原型与对象的 prototype 属性并非贰回事。
前者用于在原型链中相称不设有的品质。后者用于通过 new
关键字创立对象,它将用作新创造对象的原型。
驾驭2者的反差,将扶助你彻底驾驭 JavaScript 中的原型性情。

  Rectangle.prototype 是用 new
Rectangle() 创设出来目的的原型, 而 Rectangle 的原型实际上是 JavaScript
的 Function.prototype。(子对象的原型是父对象的 prototype 属性
对象中保存原型的变量,也被叫做内部原型引用(the internal prototype
link),历史上也曾称之为 __proto__ ,对那些称谓始终存在一些抵触。
更加纯粹的,它能够被称之为 Object.getPrototypeOf(…) 的再次回到值。

静态方法中的this指向调用它的指标,比如在底下代码中针对的正是调用它的Foo,原型方法中的this指向实例对象

(一)用户创设的对象,也正是用new关键字创设出来的目的。如:

相关文章