jQuery 1.5带来了新的Deferred对象和附加的方法.when
,.Deferred
以及._Deferred
.
对于那些谁没有带使用.Deferred
之前,我已经注释的源它
这些新方法有哪些可能的用法,我们如何将它们融入模式?
我已经阅读了API和源代码,所以我知道它的作用.我的问题是我们如何在日常代码中使用这些新功能?
我有一个缓冲类的简单示例,它按顺序调用AJAX请求.(下一个在上一个完成后开始).
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var …
Run Code Online (Sandbox Code Playgroud) 你如何深度克隆Javascript对象?
我知道基于类似的框架有各种各样的功能JSON.parse(JSON.stringify(o))
,$.extend(true, {}, o)
但我不想使用这样的框架.
什么是创建深度克隆的最优雅或最有效的方法.
我们关心像克隆数组这样的边缘情况.不打破原型链,处理自我引用.
我们不关心支持复制DOM对象,因为因为.cloneNode
这个原因而存在.
由于我主要想使用深度克隆来node.js
使用V5引擎的ES5功能是可以接受的.
[编辑]
在任何人建议让我提及之前,通过原型继承对象并克隆它来创建副本之间存在明显差异.前者使原型链变得混乱.
[进一步编辑]
在阅读完答案后,我发现了一个令人讨厌的发现,即克隆整个物体是一个非常危险和困难的游戏.以下面的基于闭包的对象为例
var o = (function() {
var magic = 42;
var magicContainer = function() {
this.get = function() { return magic; };
this.set = function(i) { magic = i; };
}
return new magicContainer;
}());
var n = clone(o); // how to implement clone to support closures
Run Code Online (Sandbox Code Playgroud)
有没有办法编写克隆对象的克隆函数,在克隆时具有相同的状态,但是如果不在o
JS中编写JS解析器,则无法改变状态.
这样的功能不再需要现实世界.这仅仅是学术兴趣.
我有一个网页,显示来自服务器的大量数据.通信是通过ajax完成的.
每次用户交互并更改此数据(假设用户A重命名某些内容)时,它都会告诉服务器执行操作,服务器返回新更改的数据.
如果用户B同时访问该页面并创建一个新的数据对象,它将再次通过ajax告诉服务器,服务器将返回该用户的新对象.
在A的页面上,我们有一个带有重命名对象的数据.在B的页面上,我们有一个新对象的数据.在服务器上,数据具有重命名的对象和新对象.
当多个用户同时使用该页面时,我有什么选择让页面与服务器保持同步?
可以避免在每次更改时锁定整个页面或将整个状态转储给用户等选项.
如果有帮助,在此特定示例中,网页调用静态web方法,该方法在数据库上运行存储过程.存储过程将返回它已更改的所有数据,而不再返回.然后静态web方法将存储过程的返回转发给客户端.
赏金编辑:
您如何设计一个多用户Web应用程序,它使用Ajax与服务器通信,但避免了并发问题?
即对数据库的功能和数据进行并发访问,而不存在数据或状态损坏的风险
// Don't break the function prototype.
// pd - https://github.com/Raynos/pd
var proto = Object.create(Function.prototype, pd({
"prop": 42
}));
var f = function() { return "is a function"; };
f.__proto__ = proto;
console.log(f.hasOwnProperty("prop")); // false
console.log(f.prop); // 42
console.log(f()); // "is a function"
Run Code Online (Sandbox Code Playgroud)
.__proto__
是非标准的并且已弃用.
我怎么应该继承原型创建一个对象,但让该对象成为一个函数.
Object.create
返回Object而不是Function.
new Constructor
返回Object而不是Function.
动机: - 跨浏览器finherit
var finherit = function (parent, child) {
var f = function() {
parent.apply(this, arguments);
child.apply(this, arguments);
};
f.__proto__ = parent;
Object.keys(child).forEach(function _copy(key) {
f[key] = child[key]; …
Run Code Online (Sandbox Code Playgroud) 我正在使用readDirSync从Diretory获取文件.请查找以下代码和错误.
var fs = require('fs');
var files = fs.readdirSync('./application/models/');
for(var i in files) {
var definition = require('../application/models/'+files[i]).Model;
console.log('Model Loaded: ' + files[i]);
}
Run Code Online (Sandbox Code Playgroud)
第2行我收到错误.ENOENT,在Object.readdirSync上没有这样的文件或目录'./application/models/'(fs.js:376:18)
我在同一个目录上有应用程序/模型.我已经检查过'/ application/models /'和'application/models /'但是失败了.我可以在服务器上看到同样的事情.
请帮忙
谢谢
我经常听说jQuery做出了一些糟糕的API决策.虽然jQuery不是我最喜欢的库,但它是我经常使用的库,我发现很难指出API设计中的具体错误或者如何改进它.
jQuery的API的哪些部分可以做得更好,它如何实现不同,为什么不同的实现会更好?
问题扩展到API的低级别个别详细信息和API的高级详细信息.我们只讨论API中的缺陷而不是库的高级设计/目的中的缺陷,jQuery仍然是以选择器引擎为中心的DOM操作库.
由于在流行的库中需要API冻结,jQuery仍处于当前状态并且开发人员做得很好.从最近的.attr
vs .prop
变化可以看出,开发人员没有灵活性来改变他们的任何设计决策(这是一种耻辱!).
我能想到的一个具体例子是
$.each(function(key, val) { })
VS
$.grep(function(val, key) { })
令人困惑的是,我必须仔细检查频繁的参数.
请不要将jQuery 库与dojo和YUI等完整的框架进行比较,并抱怨缺少功能.
在阅读了彼得关于JavaScript的文章后,我注意到了
Brendan Eich表示,Harmony的目标之一是成为JavaScript编译器的更好目标.
目前有两个流行的编译器有一些模糊的ES:符合Harmony:
虽然CoffeeScript有一些合规性,但它并不是设计成ES:Harmony编译器,所以它对此没有用.
Tracuer似乎更严格地坚持ES:Harmony规范,但我不知道它是否打算成为一个完整的ES:Harmony编译器.
由于目标是将ES6编译为ES3,因此还需要支持ES5功能(并且可能需要支持将ES5编译为ES3或ES6至ES3).
我在Traceur邮件列表上留下了一个问题.
这种编译器的目的是向后兼容ES3.在ES3中没有完全模拟ES5和ES6.
TL; DR:
我们是否需要原型OO中的工厂/施工人员?我们可以做一个范例切换并完全删除它们吗?
BackStory:
我最近一直在玩JavaScript中的原型OO并发现在JavaScript中完成的99%的OO正在强制使用经典的OO模式.
我对原型OO的看法是它涉及两件事.方法(和静态数据)的静态原型和数据绑定.我们不需要工厂或建造者.
在JavaScript中,这些是包含函数和的对象文字Object.create
.
这意味着我们可以将所有内容建模为静态蓝图/原型和数据绑定抽象,最好直接连接到文档样式的数据库中.即,从数据库中取出对象,并通过使用数据克隆原型来创建对象.这意味着没有构造函数逻辑,没有工厂,没有new
.
示例代码:
一个伪示例是:
var Entity = Object.create(EventEmitter, {
addComponent: {
value: function _addComponent(component) {
if (this[component.type] !== undefined) {
this.removeComponent(this[component.type]);
}
_.each(_.functions(component), (function _bind(f) {
component[f] = component[f].bind(this);
}).bind(this));
component.bindEvents();
Object.defineProperty(this, component.type, {
value: component,
configurable: true
});
this.emit("component:add", this, component);
}
},
removeComponent: {
value: function _removeComponent(component) {
component = component.type || component;
delete this[component];
this.emit("component:remove", this, component);
}
}
}
var entity = Object.create(Entity, toProperties(jsonStore.get(id)))
Run Code Online (Sandbox Code Playgroud)
小解释:
特定代码很冗长,因为ES5很冗长. …
var Assertion = function() {
return { "dummy": "data" };
}
Object.defineProperty(Object.prototype, 'should', {
set: function(){},
get: function(){
return new Assertion(this);
}
});
// Insert magic here.
// This needs to be false
console.log(({}).should === undefined);
Run Code Online (Sandbox Code Playgroud)
我在ES5中有哪些选项来撤消defineProperty
呼叫?
没有愚蠢的建议,Object.defineProperty = function() { }
请.
下列 Object.defineProperty(Object.prototype, 'should', {})
和 Object.defineProperty(Object.prototype, 'should', { value: undefined })
Uncaught TypeError: Cannot redefine property: defineProperty
在V8中投掷a
Object.defineProperty(Object.prototype, 'should', {
set: function() {},
get: function() { return undefined; }
}); …
Run Code Online (Sandbox Code Playgroud) javascript ×9
node.js ×4
jquery ×2
oop ×2
ajax ×1
api ×1
api-design ×1
ecmascript-5 ×1
function ×1
inheritance ×1
jsdom ×1
multi-user ×1
templates ×1