假设我的fooJavaScript代码中有一个对象. foo是一个复杂的对象,它是在其他地方生成的.如何更改foo对象的原型?
我的动机是将适当的原型设置为从.NET到JavaScript文字序列化的对象.
假设我在ASP.NET页面中编写了以下JavaScript代码.
var foo = <%=MyData %>;
Run Code Online (Sandbox Code Playgroud)
假设这MyData是在对象JavaScriptSerializer上调用.NET的结果Dictionary<string,string>.
在运行时,这将变为以下内容:
var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];
Run Code Online (Sandbox Code Playgroud)
如您所见,foo成为一个对象数组.我希望能够foo使用适当的原型进行初始化.我不是要修改Object.prototype,也没有Array.prototype.我怎样才能做到这一点?
我正在努力理解javascript中的函数和对象.据说,函数也是对象,对象是一种"关联数组",即键值对的集合.我明白,如果我写
function myFunction() {
var value = 0;
}
alert(myFunction.value); //then this gives me "undefined"
Run Code Online (Sandbox Code Playgroud)
因为变量有功能范围.但如果我写
function myFunction() {
this.value = 0;
}
alert(myFunction.value); //then this gives me "undefined" too.
Run Code Online (Sandbox Code Playgroud)
但最后,如果我写
function myFunction() {
this.value = 0;
}
myFunction.value = 0;
alert(myFunction.value); //then this gives me 0
Run Code Online (Sandbox Code Playgroud)
所以我可以给myFunction属性"value"但是来自"outside".有人可以解释发生了什么以及为什么this.value = 0; 不会创造属性"价值".
当选择使用这四种模式中的一种而不是其他模式时,是否存在任何重要/细微/显着的差异?并且,当通过Object.create()vs new运算符"实例化"时,它们之间是否存在差异?
1)CoffeeScript翻译"类"定义时使用的模式:
Animal = (function() {
function Animal(name) {
this.name = name;
}
Animal.prototype.move = function(meters) {
return alert(this.name + (" moved " + meters + "m."));
};
return Animal;
})();
Run Code Online (Sandbox Code Playgroud)
和
2)Knockout似乎促进的模式:
var DifferentAnimal = function(name){
var self = this;
self.name = name;
self.move = function(meters){
return alert(this.name + (" moved " + meters + "m."));
};
}
Run Code Online (Sandbox Code Playgroud)
和
3)我经常看到的类似的简单模式:
var DifferentAnimalWithClosure = function(name){
var name = name;
var move = …Run Code Online (Sandbox Code Playgroud) 我一直在查看my.class.js的源代码,以了解是什么让它在Firefox上如此之快.这是用于创建类的代码片段:
my.Class = function () {
var len = arguments.length;
var body = arguments[len - 1];
var SuperClass = len > 1 ? arguments[0] : null;
var hasImplementClasses = len > 2;
var Class, SuperClassEmpty;
if (body.constructor === Object) {
Class = function () {};
} else {
Class = body.constructor;
delete body.constructor;
}
if (SuperClass) {
SuperClassEmpty = function() {};
SuperClassEmpty.prototype = SuperClass.prototype;
Class.prototype = new SuperClassEmpty();
Class.prototype.constructor = Class;
Class.Super = SuperClass;
extend(Class, SuperClass, …Run Code Online (Sandbox Code Playgroud)