所以我从课堂上的一个例子中得到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。
但是在这种情况下,点不是原型,因为它没有实例吗?
答案 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.toString
在Point
原型上设置一个函数 - 这使得它成为一个属性函数,将由所有Point
值实例继承,它是一个实例属性函数,因为它使用this
值来访问实例值x
和y
。
Point.new
不是实例级函数属性,它是构造函数级函数属性,这是JavaScript等同于Java或C#等语言中的static
函数。 Point.new
函数不访问任何实例值,而是用作工厂方法。 使用this
关键字,但那是因为JavaScript中的this
有点滑稽(在这种情况下,它指的是当前的Function
对象,其中call
财产存在。