0

我有这个 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);

现在你可以看到我使用原型添加了薪水属性,但是我只是通过使用fred.notprototype = 1239;而不使用原型添加了一个属性。

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

4

2 回答 2

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的一些视频;他是一位出色的演讲者,知识渊博,喜欢听他讲话:)

于 2012-05-20T16:15:14.340 回答
1

原型上的属性做两件事:

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

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

于 2012-05-20T16:14:28.007 回答