1

我正在研究原型对象,我对以下内容有点困惑

//my constructor function
function Circle(r) { 
    this.radius = r;
    this.PI = 3.14;
}

function areaCalculator() {
    this.area = this.PI * this.radius * this.radius;
}

 function circumferenceCalculator() {
    this.circumference = 2* this.PI * this.radius;
}

因为我们的函数是一个对象,并且有一个名为原型的属性,所以可以向这个原型对象添加属性和方法,这些属性和方法将自动适用于我们使用函数构造函数创建的所有自定义对象。

Circle.prototype.areaCalculator = areaCalculator; //adding function
Circle.prototype.color = "Red"; //adding property

var circle1 = new Circle(5);
circle1.areaCalculator();
console.log(circle1.radius);//5
console.log(circle1.area); //78.5
console.log(circle1.color);//Red

如果我理解正确,所有使用 Circle 的对象都将引用相同的颜色变量,除非它们被明确设置。它是否正确?

另外,在不使用原型的情况下执行以下操作意味着什么

Circle.circumferenceCalculator = circumferenceCalculator;
Circle.color = "Red";

以上两种说法是否正确?

4

2 回答 2

3

是的,所有创建的对象new Circle都将指向同一个color属性。该属性实际上将位于原型对象上,而不是您创建的对象上。因此,当您在特定对象上设置它时,它会从原型中“隐藏”该属性,但不会覆盖它 - 您可以delete obj.color在设置后尝试,您将恢复旧颜色。

这样做Circle.color='red'只会color在对象上设置属性Circle(即使函数也是对象,但它们有一个callable属性来定义它们在调用时的行为)——这与Circle' 的原型没有任何关系。

于 2012-05-05T07:59:26.993 回答
0

函数也是一个对象,您可以为其增加属性。一个常见的例子是 jQuery,$它既是一个对象又是一个函数。

function Circle(r) {}
Circle.circumferenceCalculator = circumferenceCalculator;
Circle.color = "Red";

$.each();             //$ as an object
$('selector').each()  //$ as a function

但是,这不会反映在您创建的实例中。反映在实例上的只是那些通过原型添加的和在构造函数中添加的。

function Circle(r) { 
    this.radius = r;
    this.PI = 3.14;
}

Circle.prototype.areaCalculator = areaCalculator;
Circle.prototype.color = "Red";

var mycircle = new Circle(5);

//props on Circle itself:
//Circle.color
//Circle.areaCalculator

//props on the instance:
//mycircle.radius
//mycircle.PI
//mycircle.areaCalculator
//mycircle.color
于 2012-05-05T08:02:29.327 回答