在Javascript中使用“this”和“prototype”之间有区别吗?

时间:2009-11-17 11:33:36

标签: javascript this prototype keyword

以下两个代码之间是否存在差异,我认为不是。

function Agent(bIsSecret)
{
    if(bIsSecret)
        this.isSecret=true;

    this.isActive = true;
    this.isMale = false;
}

function Agent(bIsSecret)
{
    if(bIsSecret)
        this.isSecret=true;
}

Agent.prototype.isActive = true;    
Agent.prototype.isMale = true;

4 个答案:

答案 0 :(得分:2)

至少如果要将非基本对象分配给this.somevarprototype.somevar,则存在差异。

尝试运行:

function Agent(bIsSecret)
{
    if(bIsSecret)
        this.isSecret=true;

    this.isActive = true;
    this.isMale = false;
    this.myArray = new Array(1,2,3);
}

function Agent2(bIsSecret)
{
    if(bIsSecret)
        this.isSecret = true;
}

Agent2.prototype.isActive = true;    
Agent2.prototype.isMale = true;
Agent2.prototype.myArray = new Array(1,2,3);

var agent_a = new Agent();
var agent_b = new Agent();

var agent2_a = new Agent2();
var agent2_b = new Agent2();

if (agent_a.myArray == agent_b.myArray) 
    alert('agent_a.myArray == agent_b.myArray');
else
    alert('agent_a.myArray != agent_b.myArray');

if (agent2_a.myArray == agent2_b.myArray) 
    alert('agent2_a.myArray == agent2_b.myArray');
else
    alert('agent2_a.myArray != agent2_b.myArray');

答案 1 :(得分:1)

没有。 'prototype'用于在Javascript中实现继承。如:

/** obsolete syntax **/

var Person = Class.create();
Person.prototype = {
  initialize: function(name) {
    this.name = name;
  },
  say: function(message) {
    return this.name + ': ' + message;
  }
};

var guy = new Person('Miro');
guy.say('hi');
// -> "Miro: hi"

var Pirate = Class.create();
// inherit from Person class:
Pirate.prototype = Object.extend(new Person(), {
  // redefine the speak method
  say: function(message) {
    return this.name + ': ' + message + ', yarr!';
  }
});

var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"

您可以在此处找到代码来源和其他信息:http://www.prototypejs.org/learn/class-inheritance

答案 2 :(得分:0)

从功能上讲,这是一样的。然而,后者强调Agent个对象之间的相似性。你可以瞥见这些成员具有这个值,而在一个更复杂的构造函数中,有很多条件,它就更难了。

它还允许javascript运行时选择它如何处理Agent成员初始化。 (做一些预编译,......)

答案 3 :(得分:0)

假设此函数将用作构造函数,第一个在新实例上设置属性,第二个在原型上。如果它们独立于实例,则两个片段是等效的,但如果它们不是(顾名思义),则它们不是。