【问题标题】:Why are some object methods declared differently than others为什么某些对象方法的声明与其他方法不同
【发布时间】:2015-10-15 04:28:44
【问题描述】:

所以我有 this code 来自课堂上的一个例子。

我们创建的方法是 point.new 方法。

Point.prototype.toString = function() {
    return "(" + this.x + "," + this.y + ")";
};

Point.new = function(x,y) {
    var newObj = Object.create(this.prototype);
    this.call(newObj, x,y);
    return newObj;  
};

我不明白的是为什么我们不需要将方法声明为

point.prototype.new = function(){}

(事实上,当我这样做时它不会编译) 然而对于

point.prototype.toString(){} 

方法是必要的。在这两种情况下,我们都在向 point 对象添加一个新方法,那么为什么一个方法只在 point 上调用,而另一个在 point.prototype 上调用(我相信 this 指向 object?)

我不确定这属于什么规则,但我记得看过“向原型规则添加属性”here

但在这种情况下,点不是原型,因为它没有实例,对吧?

【问题讨论】:

标签: javascript methods constructor prototype


【解决方案1】:

原型用于定义可以在使用new Point 创建的任何对象上调用的方法。例如。你可以这样做:

var x = new Point(15, 20);
var str = x.toString();

但您不会使用x.new(),因为.new() 是用于创建新对象,它不适用于现有对象。定义Point.new 创建一个函数,可以这样调用:

var y = Point.new(10, 20);

【讨论】:

    【解决方案2】:

    在这两种情况下,我们都在向点对象添加一个新方法,

    不,你不是。

    Point.prototype.toStringPoint 原型上设置一个函数——这使它成为一个属性函数,将被所有Point 值实例继承,它是一个实例属性函数,因为它利用了@987654324 @value 访问实例值xy

    Point.new 不是实例级别的函数属性,它是构造函数级别的函数属性,这在 JavaScript 中相当于 Java 或 C# 等语言中的 static 函数。 Point.new 函数不访问任何实例值,而是用作工厂方法。它确实使用了this 关键字,但这是因为JavaScript 中的this 有点有趣(在这种情况下,它指的是当前Function 对象,call 属性所在的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 2020-09-28
      • 2018-12-07
      • 2020-12-17
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多