跳转到内容

JavaScript/构造函数和原型

来自维基教科书,开放的书籍,开放的世界


构造函数

[编辑 | 编辑源代码]

new运算符基于构造函数和原型创建新的对象。

构造函数是一个与对象名称匹配的函数,当被 new 运算符调用时,关键字this被分配给新创建的对象实例。构造函数可以根据需要分配任何初始变量。

function CoinObject() {
  this.value = 0;
}
var slug = new CoinObject();  // Creates a "slug" - a valueless coin (slug.value = 0).

构造函数可以接受参数 - 但是,无法通过具有不同数量参数的多个函数来重载构造函数。

(该new语句是从构造函数创建新 JavaScript 对象的最常见方法,但一些 JavaScript 程序员有时会使用替代技术。[1][2] )

对象的原型是一组自动创建的字段和方法。它不能独立运行,依赖于现有的构造函数。

创建对象时,原型中初始化的字段将被复制到新创建的对象。

function CoinObject() {
  this.value = 0;
}
CoinObject.prototype.diameter = 1;
slug = new CoinObject();  // A valueless coin (slug.value = 0), with diameter of 1 (slug.diameter = 1)

由于对象的原型表现为对象,因此可以使用它来创建继承。

动态扩展对象

[编辑 | 编辑源代码]

JavaScript 中的对象是完全动态的,如果对象中不存在字段,则可以立即创建该字段。例如,如果您发现现在需要跟踪硬币示例中的厚度,则可以简单地将新字段添加到原型。

更改对象的原型允许对象的现有实例访问该更改。

当在新对象上分配属性值时,该属性优先于其祖先的原型属性。如果您从新对象中删除该属性,则继承链将带您回到父对象的属性。

为了演示,一个Animal构造函数用于创建一个名为 Spot 的对象。在创建之后,构造函数添加了一个性别属性。该性别属性也可以从 Spot 的对象访问。

性别属性可以更新,如果从狗对象中删除性别属性,它将从其祖先而不是Animal构造函数中检索所需的属性。

function Animal (type, name) {
  this.type = type || 'No type';
  this.name = name || 'No name';
}
var dog = new Animal('dog', 'Spot');

// Add gender to the Animal object
Animal.prototype.gender = 'unspecified';
// dog.gender is 'unspecified'

dog.gender = 'male';
// dog.gender is 'male';

delete(dog.gender);
// dog.gender is once again, 'unspecified'

参考资料

[编辑 | 编辑源代码]
  1. Greg Tatum. "杀死 JavaScript 的 this". JavaScript 支持面向对象编程的许多替代方案的示例。一个部分 "典型的面向对象 JavaScript".
  2. Douglas Crockford. "Crockford 关于 JavaScript -- 第三幕:终极函数" pdf "Crockford 关于 JavaScript -- 第三幕:终极函数" 视频. 描述了在 JavaScript 中创建对象构造函数的几种不同方法。


华夏公益教科书