在比较Javascript中的函数时,我认为它会比较定义函数的内存,以交叉检查给定的2个函数是否相等。
因此,试图通过从以下相同对象的2个不同实例访问它来比较成员函数:
function testFn(name) {
var name = name;
var self = this;
self.compareFn = function() {
console.info(name);
}
}
var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.info(fn1.compareFn == fn2.compareFn); //Returns false
使用一个成员函数(" compareFn")定义了一个对象testFn并创建了它的两个实例(fn1,fn2),但是在比较" fn1.compareFn == fn2.compareFn
" ,它失败了。
请记住,该成员函数在多个实例之间共享,只有局部变量将单独分配 请说明为什么这种比较失败。
答案 0 :(得分:1)
实际上是为每个实例创建了该方法。你想在对象的原型上声明它。见下文。
var testFn = function(name) {
this.name = name;
}
testFn.prototype.compareFn = function() {
console.info(this.name);
}
var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.info(fn1.compareFn == fn2.compareFn); //Returns true
答案 1 :(得分:1)
如果您希望在多个实例之间共享该功能,请执行以下操作:
function testFn(name) {
var self = this;
}
testFn.prototype.compareFn = function() {
console.log(name);
};
var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.log(fn1.compareFn == fn2.compareFn);
答案 2 :(得分:1)
此操作失败,因为每次执行new testFn
时都会生成新的compareFn
;你没有指向构造函数之外的引用或继承原型。
您无法使用共享功能从构造函数中访问var
iable,因为它无法访问该闭包。如果要实现共享功能,则需要将这些值移动到可引用的空间,即
function testFn(name) {
var vars = {}; // using object because javascript passes refs for objects
this.vars = vars; // make `this.vars` point to `vars`
vars.name = name; // set whatever on your object
}
testFn.prototype.compareFn = function () {
console.info(this.vars.name); // can access `vars` through ref of `this.vars`
};
现在
var a = new testFn('foo'), b = new testFn('bar');
a.compareFn === b.compareFn; // true;
a.compareFn(); // logs "foo"
答案 3 :(得分:1)
我认为它出现为false
的原因是,至少在这里,不是测试“源代码”结果的相等性。它正在测试它们所引用的内存位置。这样做的原因是它无法以任何其他方式测试相等性。
通过运行函数
来测试返回值 fn1.compareFn() == fn2.compareFn() //true
通过调用toString()
来测试源代码(注意:这在浏览器中没有标准化!):
fn1.compareFn.toString() == fn2.compareFn.toString() //true
但是,因为它们是不同的实例(您没有调用testFn == testFn
或fn1.compareFn == fn1.compareFn
),所以它们会引用不同的内存位置,因此相等的测试结果为false
关于这方面的更多信息也可以在这个问题上找到:' how compare two static function are equal or not in javascript'。
另外,作为一个注释,你应该使用三等于(===
)而不是一个双等于'因为后者不测试类型的相等性(即检查2个变量都是数字,以及值为5)。
答案 4 :(得分:0)
每次调用函数testFn
时,它都会创建一个新变量并为其赋值...
所以是的,它们是相同的功能,但它们不是一回事。
您可以使用其他几种模式来获得您想要的结果。在这种情况下,您需要使用原型模式:
// Constructors should start with an upper case letter
function TestFn(name) {
this.name = name;
}
TestFn.prototype.testFn = function() {
console.info(this.name);
}
var fn1 = new TestFn('fn1');
var fn2 = new TestFn('fn2');
console.info(fn1.compareFn == fn2.compareFn); // Returns true
答案 5 :(得分:0)
function testFn(name) {
this.name = name;
}
testFn.prototype.compareFn = function() {
console.info(name);
}
var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.info(fn1.compareFn == fn2.compareFn); //Returns TRUE
每次调用构造函数时都要重新定义函数,因此方法不相等。通过将它们分配给原型,它是相同的方法。
如果您有兴趣将name
(或其他变量或函数设为私有),请查看this SO answer。