通过原型为实例定义唯一方法

时间:2014-02-12 11:32:12

标签: javascript prototype

我有一个名为Rectangle的对象:

    function Rectangle(x, y) {
            this.x = x;
            this.y = y ;
            this.surface = function(x, y) {
                return x*y;
            }
        }
Rectangle.prototype.couleur = "Rouge";

我有两个这个对象的实例:

r1 = new Rectangle(3, 5);
r2 = new Rectangle(4, 7);

然后我宣布了第三个实例:

r3 = new Rectangle(6, 7);

我希望这个实例有一个独特的方法:

afficheCouleur = function() {
        return this.couleur;
    }

我试着这样:

r3.prototype.afficheCouleur = function() {
        return this.couleur;
    }

但我收到了这个错误:

[11:32:40.848] TypeError: r3.prototype is undefined @ file:///media/tpw/760F-F396/vv:24

3 个答案:

答案 0 :(得分:2)

直接声明方法:

r3.afficheCouleur = function() {
    return this.couleur;
}

这是因为prototype是构造函数(函数)的属性,r3是对象。

答案 1 :(得分:1)

如果你这样做,你将得到2 Rectangle个不同的实现。

创建第二个继承自第一个类的类:

function Rectangle(x, y) {
    this.x = x;
    this.y = y ;
    this.surface = function(x, y) {
        return x*y;
    }
}
Rectangle.prototype.couleur = "Rouge";


function ColourRectangle(x, y) {
    Rectangle.apply(this, arguments);

    this.afficheCouleur = function() {
        return this.couleur;
    }
}
ColourRectangle.prototype = new Rectangle();
ColourRectangle.prototype.constructor = Rectangle;


var a = new Rectangle(1, 2);
console.log(a.y); //2
console.log(a.afficheCouleur);   //undef

var b = new ColourRectangle(3, 4);
console.log(b.y); //2
console.log(b.afficheCouleur()); // Rouge

答案 2 :(得分:1)

假设你可能会考虑你的服务函数使用Rectangle的x和y而不是传递它们(如果你想知道Rectangle的表面,你为什么要传递它们?)。

您可能在此体内声明服务的一个问题是,当您更改Rectangle实例的x和y时,它不会更新x和y。这是因为x和y在closure范围内被记住。

您最终可能会得到以下代码:

function Rectangle(x, y) {
    this.x = x;
    this.y = y ;
    this.surface = function() {
        return x*y;
    }
}

var r = new Rectangle(5,5);
console.log(r.surface());//=25
r.y =500;
console.log(r.surface());//=25/
console.log(r.x*r.y);//=2500

你应该在surface方法中返回this.x * this.y,但由于你没有使用闭包来模拟私有成员,你也可以把这个函数放在原型上。

function Rectangle(x, y) {
    this.x = x;
    this.y = y ;
}
Rectangle.prototype.surface = function() {
    return this.x*this.y;
}

var r = new Rectangle(5,5);
console.log(r.surface());//=25
r.y =500;
console.log(r.surface());//=2500
console.log(r.x*r.y);//=2500

我知道这不会回答你的问题,但是你要求添加一个方法,该方法将在实例上唯一地在实例(原型)之间共享。 Danilo和Basha已经指出这不可能做到这一点。

我对您的问题的评论中发布的链接可以帮助您更好地了解原型是什么,如何使用成员以及具体实例是什么。