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