第一个和第二个代码有什么区别? 有任何逻辑差异吗?
第一
function test(val) {
this.val = val;
this.get = function () {
return "Hello world";
};
}
第二
function test(val) {
this.val = val;
}
test.get = function () {
return "Hello world";
};
何时向构造函数添加方法,何时设置方法,以及为什么?
答案 0 :(得分:3)
第二个为函数本身添加一个方法。这与第一个中的实例方法不同。
这两个功能相似:
function test(val) {
this.get = function () {};
}
和
function test(val) {
}
test.prototype.get = function() {};
两者都创建将如下工作的实例方法:
var x = new test("hello");
x.get();
但是,您的第二个选项只是在构造函数上创建一个属性,该属性不是测试创建对象的方法。这是一种静态方法。当你这样做时:
function test(val) {
this.val = val;
}
test.get = function () {
return "Hello world";
};
然后执行:
var x = new test("hello");
x.get();
您会发现x
对象没有.get()
方法。该方法仅在构造函数本身test.get()
上。对于存在于对象的新实例上的方法,必须将其分配给原型对象或在创建对象之后将其分配给对象(例如,在构造函数中或在某些其他方法中)。直接附加到构造函数本身的方法(如test.get = function () {}
)只是构造函数的属性,不会被构造函数创建的对象继承。它们有点类似于其他语言中的类静态方法。它们不是实例方法。
答案 1 :(得分:1)
在第一个示例中,get
方法仅在创建新对象时可用。
test.get(); // This will throw an error
var a = new test();
a.get(); // This will work.
在第二个示例中,可以直接在测试函数
上调用get
方法
test.get(); // This will work.
如果您要将代码放入英语中,它会显示为
首先:
get
函数。第二
get
的函数定义为test
函数的属性。答案 2 :(得分:1)
在你的第一个例子中,幕后的JavaScript是为你创建一个对象,它会在失败的查找中委托给Constructors Prototype,它也会为你返回该对象。例如,
function test(val) {
//var this = Object.create(test.prototype);
this.val = val;
this.get = function () {
return "Hello world";
};
//return this;
}
因此,您实际上是在每次调用测试函数时为每个为您创建的实例对象添加一个方法。
在第二个例子中,您正在利用函数只是JavaScript中的对象并向函数添加属性这一事实,这种情况相当罕见。