我不是那种动态编程语言,但是我写了很多JavaScript代码.我从来没有真正了解这个基于原型的编程,有没有人知道这是如何工作的?
var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Run Code Online (Sandbox Code Playgroud)
我记得很久以前我和人们进行了很多讨论(我不确定我在做什么)但是据我所知,没有一个类的概念.它只是一个对象,这些对象的实例是原始的克隆,对吧?
但是JavaScript中这个".prototype"属性的确切目的是什么?它与实例化对象有什么关系?
var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!
function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK
Run Code Online (Sandbox Code Playgroud)
这些幻灯片也非常有帮助.
我已经看到了一些在javascript中实例化对象的不同方法,想知道各种方法的优点/缺点以及为什么要使用其中一种方法.
方法1
var obj = {
prop: value,
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
方法一是标准方法,没什么新的:)
方法2
var obj = new function() {
var prop1 = value1;
var fn1 = function() {
};
.
.
.
this.prop2 = value2;
.
.
.
}();
Run Code Online (Sandbox Code Playgroud)
函数方法,我想将此方法与方法3进行比较.函数方法主要用于封装(正确吗?)
方法3
var obj = (function() {
var prop1 = value1;
var fn1 = function() {
};
.
.
.
return {
prop2: value2,
.
.
.
}
})();
Run Code Online (Sandbox Code Playgroud)
通过这种方法,我不太清楚其使用背后的原因.它与方法2有何不同?两者都可用于封装逻辑.
是这样我们可以传递参数,所以我们可以处理任何潜在的冲突?例如jquery的$语法 - 但你也可以用方法2做到这一点......
谢谢.
编辑:
我知道方法1和3是相似的(因为它们都返回对象)但是方法3也创建了一个闭包.哪种方法2也有.
这是我的问题的基础,2和3都创建了闭包,但它们之间有什么区别.