javascript中两种OO方法的区别是什么?
我一直在使用下面的代码,我看到其他代码使用函数{},然后使用this关键字,这里的区别是什么,我是否实际实例化了下面的对象javascript中两种OO方法的区别是什么?,javascript,Javascript,我一直在使用下面的代码,我看到其他代码使用函数{},然后使用this关键字,这里的区别是什么,我是否实际实例化了下面的对象 var MyObj = { propertyOne: 'a', Method: (function() { function MyFuncOne() {} function MyFuncTwo() {} return {
var MyObj = {
propertyOne: 'a',
Method: (function() {
function MyFuncOne() {}
function MyFuncTwo() {}
return {
MyFuncOne: MyFuncOne,
MyFuncTwo: MyFuncTwo
}
})()
}
我能想到这样做的唯一原因是,如果您希望在更改私有变量以使其合法化后,在两个函数之间共享一些私有变量:
var MyObj = (function() {
var x,y,z; // these will be accessible only to
// the MyFuncOne and MyFuncTwo functions
function MyFuncOneA() {}
function MyFuncTwoA() {}
return {
MyFuncOne: MyFuncOneA,
MyFuncTwo: MyFuncTwoA
}
})();
我不得不改变你的语法,甚至使它工作,因为你有它myObj={{…},这是不是很有用,甚至可能是无效的
除了这个私有但共享变量的概念之外,它只是在一个对象上声明两个方法的额外的、混乱的语法,有更清晰的方法可以做到这一点
如果您没有使用私有变量,那么上面的示例在功能上与这个简单得多的语法相同,这对我来说更有意义:
var MyObj = {
MyFuncOne: function() {},
MyFuncTwo: function() {}
};
我能想到这样做的唯一原因是,如果您希望在更改私有变量以使其合法化后,在两个函数之间共享一些私有变量:
var MyObj = (function() {
var x,y,z; // these will be accessible only to
// the MyFuncOne and MyFuncTwo functions
function MyFuncOneA() {}
function MyFuncTwoA() {}
return {
MyFuncOne: MyFuncOneA,
MyFuncTwo: MyFuncTwoA
}
})();
我不得不改变你的语法,甚至使它工作,因为你有它myObj={{…},这是不是很有用,甚至可能是无效的
除了这个私有但共享变量的概念之外,它只是在一个对象上声明两个方法的额外的、混乱的语法,有更清晰的方法可以做到这一点
如果您没有使用私有变量,那么上面的示例在功能上与这个简单得多的语法相同,这对我来说更有意义:
var MyObj = {
MyFuncOne: function() {},
MyFuncTwo: function() {}
};
是的,您已经用两个方法实例化了一个单例对象 我认为外部的花括号是不必要的,你可以这样写:
var MyObj =
(function() {
function MyFuncOne() {}
function MyFuncTwo() {}
return {
MyFuncOne: MyFuncOne,
MyFuncTwo: MyFuncTwo
};
})();
另一种方法是:
var MyObj =
(function() {
var obj = {};
obj.MyFuncOne = function() {};
obj.MyFuncTwo = function() {};
return obj;
})();
在函数{/*code here*/}中包装JS是防止变量泄漏到全局范围的良好实践。在本例中,您使用它来组装一个对象。是的,您已经用两个方法实例化了一个单例对象 我认为外部的花括号是不必要的,你可以这样写:
var MyObj =
(function() {
function MyFuncOne() {}
function MyFuncTwo() {}
return {
MyFuncOne: MyFuncOne,
MyFuncTwo: MyFuncTwo
};
})();
另一种方法是:
var MyObj =
(function() {
var obj = {};
obj.MyFuncOne = function() {};
obj.MyFuncTwo = function() {};
return obj;
})();
在函数{/*code here*/}中包装JS是防止变量泄漏到全局范围的良好实践。在本例中,您正在使用它来组装一个对象。使用带有此关键字的函数,您可以完成比可能更多的事情,或者至少可以轻松地使用上面的匿名函数返回的对象文本。最常见的是创建类型
function Animal () { }
Animal.prototype.speak = function () {
return "";
};
var dog = new Animal();
dog instanceof Animal; // returns true
这也使继承更容易:
function Feline () { }
Feline.prototype = new Animal;
Feline.prototype.speak = function () {
return "meow";
};
function Lion () { }
Lion.prototype = new Feline;
Lion.prototype.speak = function () {
return "roar";
};
function Cat () { }
Cat.prototype = new Feline;
var leo = new Lion();
var baxter = new Cat();
leo.speak(); // returns "roar"
baxter.speak(); // returns "meow" - from prototype chain
leo instanceof Feline; // returns true
leo instanceof Animal; // returns true
leo instanceof Cat; // returns false
演示:使用带有此关键字的函数,您可以完成比可能更多的事情,或者至少可以轻松地使用上面的匿名函数返回的对象文本。最常见的是创建类型
function Animal () { }
Animal.prototype.speak = function () {
return "";
};
var dog = new Animal();
dog instanceof Animal; // returns true
这也使继承更容易:
function Feline () { }
Feline.prototype = new Animal;
Feline.prototype.speak = function () {
return "meow";
};
function Lion () { }
Lion.prototype = new Feline;
Lion.prototype.speak = function () {
return "roar";
};
function Cat () { }
Cat.prototype = new Feline;
var leo = new Lion();
var baxter = new Cat();
leo.speak(); // returns "roar"
baxter.speak(); // returns "meow" - from prototype chain
leo instanceof Feline; // returns true
leo instanceof Animal; // returns true
leo instanceof Cat; // returns false
演示:我一定是个闭门造车的人,因为我从来没有见过这样的对象构造。当然,您是从函数返回对象的。看起来有点奇怪。@JeffreySweeney:不仅仅是你。在我看来,那个代码完全是奇怪的。我敢打赌它做不到它应该做的。这个片段在语法上是不正确的。大括号是用来代替分号的。它在IE9和Chrome中运行良好,但你是对的,它不是有效的ECMAScript。我必须是一个闭门造车的人,因为我从未见过这样的对象构造。当然,你是从函数返回一个对象。看起来有点奇怪。@JeffreySweeney:不仅仅是你。在我看来,那个代码完全是奇怪的。我敢打赌它做不到它应该做的。这个片段在语法上是不正确的。大括号是用来代替分号的。它在IE9和Chrome中运行良好,但您是对的,它不是有效的ECMAScript。