JavaScript-javascript能不能使用动态原型链?

JavaScript-javascript能不能使用动态原型链?

瑾兮 发布于 2017-02-10 字数 648 浏览 1068 回复 2
//基类
function Polygon(sides) {
this.sides = sides;
if (typeof Polygon._initialized == “undefined”) {
Polygon.prototype.getArea = function () {
return 0;
};
Polygon._initialized = true;
}
}
//继承类
function Triangle(base, height) {
Polygon.call(this, 3);
this.base = base;
this.height = height;
if (typeof Triangle._initialized == “undefined”) {
Triangle.prototype = new Polygon();//这一行提示有错误,为什么?
Triangle.prototype.getArea = function () {
return 0.5 * this.base * this.height;
};
Triangle._initialized = true;
}
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晚风撩人 2017-04-12 2 楼

提示有错误是引号的问题。“undefined” 改为 "undefined";

在Triangle类中使用 this,并将prototype 改为 __proto__

function Triangle(base, height) {
Polygon.call(this, 3);
this.base = base;
this.height = height;
if (typeof this._initialized == "undefined") {
this.__proto__ = new Polygon();
this.__proto__.getArea = function () {
return 0.5 * this.base * this.height;
};
this._initialized = true;
}
}

var t = new Triangle(20,6);
alert(t.getArea()); //输出60

或者将上边的改为

function Triangle(base, height) {
this.base = base;
this.height = height;
}
Triangle.prototype = new Polygon();
Triangle.prototype.getArea = function(){
return 0.5 * this.base * this.height;
}

我想这样写就不用判断initialized的了吧,我也刚接触,不知道对不对。。

泛泛之交 2017-02-27 1 楼

仔细分析了一下代码,应该把Triangle.prototype = new Polygon();提到外面来

//基类
function Polygon(sides) {
this.sides = sides;
if (typeof Polygon._initialized == “undefined”) {
Polygon.prototype.getArea = function () {
return 0;
};
Polygon._initialized = true;
}
}
//继承类
function Triangle(base, height) {
Polygon.call(this, 3);
this.base = base;
this.height = height;
if (typeof Triangle._initialized == “undefined”) {
Triangle.prototype.getArea = function () {
return 0.5 * this.base * this.height;
};
Triangle._initialized = true;
}
}

Triangle.prototype = new Polygon();

下面再实例化Triangle。

应该先继承,再实例化!

比如你进行实例化Triangle时候:
var obj = new Triangle(1,3); 这时候只是构造了一个Triangle对象,该函数体并没执行。也就是说obj的prototype值是一个函数对象;当函数执行Triangle()内,你对Triangle.prototype = new Polygon();来改变Triangle.prototype的值。这时候obj已经被实例化了,所以这个语句改变不料它的prototype 。