当我们可以添加属性时,为什么要使用原型

时间:2012-05-20 16:09:21

标签: javascript

我有这个javasctipt类

function employee(name, jobtitle, born)
{
    this.name = name;
    this.jobtitle = jobtitle;
    this.born = born;
}

var fred = new employee("Fred Flintstone", "Caveman", 1970);
employee.prototype.salary = null;
fred.salary = 20000;
fred.notprototype = 1239;
console.log(fred);

现在您可以看到我使用原型添加了salary属性,但之后我只使用fred.notprototype = 1239;添加了一个属性,而没有使用原型。

当我在对象fred上执行console.log时,我看到那里没有原型。那么添加原型是不对的吗?如果是,那么它有什么区别?

2 个答案:

答案 0 :(得分:3)

让我们说,在所有代码之后添加:

var john = new employee("John Carson", "Philantropist", 2015);
console.log(john);

它会显示john具有salary属性(值null)。你没有自己设定,它来自原型链。

通过添加X原型,您可以更改new X()创建的所有对象。

另一个例子:

function School(name)
{
    this.name = name;
}

School.prototype.getName = function() {
    return this.name;
}

var school_one = new School('one');

console.log(school_one.getName()); // prints "one"

在此示例中,方法getName已添加到原型中。在创建school_one对象后,它会从School.prototype继承您添加到它的所有内容(在这种情况下只是一个方法)。

这可用于声明对象的接口(用于访问它的方法)或默认值与构造函数分开。

为了更深入地了解JavaScript及其独特功能,我强烈建议您查看Douglas Crockford中的一些视频;他是一个伟大的演讲者,知识渊博,喜欢听他说:)

答案 1 :(得分:1)

原型上的属性做了两件事:

  1. 对于“普通”变量,它们可以提供默认值,当您第一次将具有相同名称的属性写入对象时,该值将被隐藏

  2. 对于成员函数,它们减少了包含其自己的该函数副本的对象的每个实例的开销。

相关问题