为什么某些对象方法的声明与其他方法不同

时间:2015-10-15 04:28:44

标签: javascript methods constructor prototype

所以我从课堂上的一个例子中得到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.prototype上被调用(我相信这指向了对象?)

我不确定这个规则是什么,但我记得看着“为原型规则添加属性”here

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

  

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

不,你不是。

Point.prototype.toStringPoint原型上设置一个函数 - 这使得它成为一个属性函数,将由所有Point值实例继承,它是一个实例属性函数,因为它使用this值来访问实例值xy

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