0

我是 JS 编程的新手,并试图理解基于原型的继承。下面是我的测试代码,我对行方法“parseParameters”有疑问。

据我所知,当我实例化类 Point 并拧紧以下内容时:

var p = new Point ({x: 1, y: 1});
alert(p.x);

成员“x”首先在 Point 类中搜索,然后在其原型(Shape)中搜索。这样对吗?

并质疑自己:在 Point 类或 Shape(原型)中将在哪里创建成员“x”和“y”?

一句话:我真的应该考虑一下吗?也许这是一个微不足道的问题,无论成员在哪里创建?

var Shape = function () {}

Shape.prototype = {
    getParameter: function (params, name) {
        return params !== null && params !== undefined
            ? params[name]
            : 0;
    },

    parseParameters: function(params, names) {
        if (params === null || params === undefined) {
            return;
        }

        for(var i = 0; i < names.length; i++) {
            this[names[i]] = params[names[i]];
        }
    }
}

var Point = function (params) {
    this.parseParameters(params, ['x', 'y'])
}

Point.prototype = new Shape;
4

1 回答 1

0

p.x

成员“x”首先在 Point 类中搜索,然后在其原型(Shape)中搜索。这样对吗?

除此之外,JavaScript 中没有“类”,是的。属性名称将首先在p对象本身上搜索,然后在它继承的对象中搜索(有一个内部链接)。

在 Point 类或 Shape(原型)中将在哪里创建成员“x”和“y”?

取决于您如何创建它们:-)

在简单的赋值中,like p.x = 1;(也发生在parseParameters' this[names[i]] = params[names[i]], as 中this === p)属性将在p对象上创建。

我真的应该考虑一下吗?也许无论成员在哪里创建?

不,这真的很重要。如果您在原型对象上创建它们,则从该原型对象继承的所有对象都将共享相同的值。虽然这对函数很有用,但对于数据属性(例如,实例与实例之间应该有所不同)将是灾难性的xy另请参阅为什么我的 JavaScript 对象属性被其他实例覆盖?例如)。

于 2012-12-07T14:17:02.913 回答