gpt4 book ai didi

Javascript 常量设置变量

转载 作者:行者123 更新时间:2023-11-30 05:52:30 26 4
gpt4 key购买 nike

运行此代码时,构造函数 Test(callbacks) 中首先传入的任何值都会成为始终调用的回调,即使在 Test 的后续实例化中也是如此

function Test(callbacks) {
if (callbacks) {
if (callbacks.callback) {
this.callback = callbacks.callback;
}
}

this.options.complete = $.proxy(this.options.complete, this);
}

Test.prototype = {
options: {
type: "GET",
complete: function() {
this.callback();
}
},
callback: function() { console.log("OVERRIDE ME"); },

execute: function() {
$.ajax(this.options);
}
};

var eins = {callback: function() {console.log("AAA");}};
var zwei = {callback: function() {console.log("BBB");}};

var A = new Test(eins);
var B = new Test(zwei);

A.execute();
B.execute();

运行这段代码,每次你都会得到输出AAAfunction() {console.log("AAA");} 如何成为原型(prototype)的常量值?

最佳答案

一切都从这一行开始:

this.callback = callbacks.callback;

当您调用 new Test(eins) 时,eins 作为 callbacks 参数传入。然后,该行将 this.callback(即新测试实例上的“回调”属性)设置为 callbacks 的回调属性,即。 eins 的。

现在,仅此一项不会影响 B。但是,有一些棘手的事情:

this.options.complete = $.proxy(this.options.complete, this);

您会认为这会在您的测试实例上设置“选项”属性,对吗?错误的。 Javascript 的工作方式是,如果一个属性没有在您的实例上定义(例如,您没有执行 this.options = something),那么 Javascript 将查找“原型(prototype)链”,它在哪里将找到原型(prototype)的“选项”并设置它(不是您的实例的“选项”,因为您的实例没有)。

您可以通过将该行更改为以下内容来解决所有这些问题:

this.options = {complete: $.proxy(this.options.complete, this)};

但这当然会丢失您的 type: "GET", 所以您需要这样做:

this.options = {type: "GET", complete: $.proxy(this.options.complete, this)};

或者您需要根据原型(prototype)的选择:

this.options = {};
for (var key in this.prototype.options) {
this.options[key] = this.prototype.options[key];
}
this.options.complete = $.proxy(this.options.complete, this);

如果您碰巧正在使用(优秀的)Underscore 库,它甚至有一个extend 函数可以更轻松地完成这类事情:

this.options = _.extend({}, this.prototype.options,
{complete: $.proxy(this.options.complete, this)});

或者(取决于您的风格偏好):

this.options = _.extend({}, this.prototype.options);
this.options.complete = $.proxy(this.options.complete, this);

顺便说一句,Underscore 也有一个_.bind 方法,它与jQuery 的“代理”相当,所以你也可以这样做:

this.options = _.extend({}, this.prototype.options);
this.options.complete = _.bind(this.options.complete, this);

关于Javascript 常量设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com