分配给函数内部和函数外部的属性有什么区别?

时间:2014-01-23 16:11:56

标签: javascript

function foo(){
this.a =2;
};

//assign a property
foo.color = 'red';

//assign a method
foo.sayHello = function(){`enter code here`
alert("hello!");
};
var foo1 = new foo();
console.log(foo.color); //red
console.log(foo1.color); //undefined
我有这样的立场。我可以做foo1.a并返回2。 但如果我正在做foo1.color它是未定义的。 谁能告诉我如何通过实例访问函数外部定义的属性和方法,以及在函数内部和外部定义属性有什么区别?

3 个答案:

答案 0 :(得分:1)

foo.prototype.color = 'red'会将该属性分配应用于new foo()的所有实例。

此属性将应用于所有实例,甚至是已存在的实例。

另一方面,

this.a = 2仅适用于当前实例。

答案 1 :(得分:1)

第一个在a上定义一个属性this,当它被称为构造函数时,它将是foo方法的实例(使用new运营商)。 foo的每个实例都会拥有此属性的副本。

第二个在color函数对象本身定义静态属性foo。实例不会继承此属性。

第三个又定义了一个静态属性sayHello,其值恰好是一个函数。

如果要定义将由所有实例继承的属性,则需要在构造函数的prototype上定义它们:

foo.prototype.color = 'red';

在这种情况下,foo的每个实例都可以访问相同的 color属性(而不是像第一个示例中那样自己的副本)。 / p>

答案 2 :(得分:0)

foo.prototype.color = 'red'会将属性赋值应用于新foo()的所有实例。

this.a = 2 // will add property 'a' to the current instance.

E.g

var foo1 = new foo();
console.log(foo.color); // red

执行此功能将向窗口对象添加属性(此处为a)。它将它添加到窗口中,因为window是在执行它时调用函数的对象,而函数中的函数是调用函数的对象。

foo() // call foo() using window object.
console.log(this.a); // outputs to 2. Here is should be noted that this refers to window object  

Demo fiddle