我已经看到了一些在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都创建了闭包,但它们之间有什么区别.
我注意到某些代码评估了某个电子商务网站的鞋码并将其输出到屏幕上,这使得Chrome中的订单变得混乱.
给出的JSON可以是:
{
"7": ["9149", "9139", "10455", "17208"],
"7.5": ["9140", "9150", "10456", "17209"],
"8": ["2684", "9141", "10457", "17210"],
"8.5": ["9142", "10444", "10458", "17211"],
"9": ["2685", "9143", "10459", "17212"],
"9.5": ["10443", "9144", "10460", "17213"]
}
Run Code Online (Sandbox Code Playgroud)
...将尺寸增加一半.
转换为对象并迭代键后,自然顺序得到尊重,它们出现为:
7,7.5,8,8.5等
但仅在Chrome中,"看起来像圆形数字"的键总是首先从对象中出来,因此for ... in循环的输出是:
7,8,9,7.5,8.5,9.5 ......
Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]
Run Code Online (Sandbox Code Playgroud)
以下是测试用例:https://jsfiddle.net/wcapc46L/1/
它只影响整数,似乎Webkit/Blink有一个优化,它更喜欢数字的对象属性,也许它与分支预测或其他什么有关.
如果在对象键前面加上任何字符,则顺序不受影响并按预期工作 - FIFO
我想我会记得读到对象的属性顺序没有任何保证,但与此同时,这是极端烦人的,并且会导致为Chrome用户单独修复它的相当大的努力.
有任何想法吗?这可能是一个会被修复的错误吗?
另外编辑,我现在发现这是v8 bug跟踪器上的一个问题:
http://code.google.com/p/v8/issues/detail?id=164
看起来Blink不想解决这个问题,并且仍然是唯一能够做到这一点的浏览器.
更新任何哈希表优化webkit/blink,现在已经进入壁虎(FF 27.0.1) - http://jsfiddle.net/9Htmq/结果
7,8,9,7.5,8.5,9.5._在密钥返回正确/预期订单之前应用. …
我对Javascript有些新意,所以也许这只是一个noob错误,但我没有找到任何特别有助于我环顾四周的东西.我正在写一个游戏,我正在尝试为暂停菜单构建一个对象.
我想做的其中一件事是,为了组织起见,菜单上的按钮是pause_menu对象内的对象.我最终要为这些对象添加事件处理程序,我也想在pause_menu对象中执行此操作.有些按钮尚未完全编码,但我希望在继续操作之前至少可以使用一些按钮.
我正在使用Raphael.js v1.5.2渲染形状.拉斐尔的东西适用于界面的其余部分,但是代码并不像这样令人愉快,所以类似的东西对我来说会更好.
我目前的问题是,当我执行var pause_menu = new pause_menu()时,实际上没有任何渲染.
这是我到目前为止暂停菜单的代码:
//Pause Menu Object:
function pause_menu() {
function pause_button() {
this.button = game.rect(0, 350, 150, 50, 5);
this.text = game.text(75, 375, 'PAUSE');
}
function resume_button() {
this.button;
this.text;
}
function quit_button() {
this.button;
this.text;
}
this.pause_button = new pause_button(); //the button that the user presses to pause the game (I want an event handler on this to trigger .show() method for presently hidden menu items)
this.resume_button = new resume_button();
this.quit_button = …Run Code Online (Sandbox Code Playgroud) 在开发我的反应程序,我需要一个条件道具发送到一个组件,所以我在什么地方找到一个模式来做到这一点,但它似乎很奇怪,我和我无法理解如何以及为什么它的工作.
如果我输入:
console.log(...undefined) // Error
console.log([...undefined]) // Error
console.log({...undefined}) // Work
Run Code Online (Sandbox Code Playgroud)
在未定义时激活扩展运算符时会引发错误,但是当undefined在对象内部时,会返回一个空对象.
我对这种行为感到非常惊讶,这真的是它应该如何,我能依靠这个并且这是一个好习惯吗?
这是我在JavaScript中的用例:
我有两个对象数组,它们具有匹配的属性(id和name).
var result1 = [
{id:1, name:'Sandra', type:'user', username:'sandra'},
{id:2, name:'John', type:'admin', username:'johnny2'},
{id:3, name:'Peter', type:'user', username:'pete'},
{id:4, name:'Bobby', type:'user', username:'be_bob'}
];
var result2 = [
{id:2, name:'John', email:'johnny@example.com'},
{id:4, name:'Bobby', email:'bobby@example.com'}
];
var props = ['id', 'name'];
Run Code Online (Sandbox Code Playgroud)
我的目标是让另一个对象数组只包含不匹配的元素.像这样:
var result = [
{id:1, name:'Sandra'},
{id:3, name:'Peter'}
];
Run Code Online (Sandbox Code Playgroud)
我知道有一种方法可以通过从result1比较每个对象和result2的对象,然后比较它们的键,如果没有匹配,将值放在另一个对象然后将它推入新数组,但我奇怪是否有更优雅的方式,如使用低破折号或下划线或类似的东西.
谢谢!
在ES6中我们可以做匿名类:
var entity = class {
}
Run Code Online (Sandbox Code Playgroud)
但我们也可以实例化它:
var entity = new class {
constructor(name) { this.name = name; }
getName() { return this.name; }
}('Foo');
console.log(entity.getName()); // Foo
Run Code Online (Sandbox Code Playgroud)
背后做了什么,它带来了什么好处以及它带来了什么警告?
javascript oop anonymous-function javascript-objects ecmascript-6
数组只是伪装成对象吗?为什么/为什么不呢?他们以什么方式(这样/不是)?
我一直认为JS中的数组和对象基本相同,主要是因为访问它们是相同的.
var obj = {'I': 'me'};
var arr = new Array();
arr['you'] = 'them';
console.log(obj.I);
console.log(arr.you);
console.log(obj['I']);
console.log(arr['you']);
Run Code Online (Sandbox Code Playgroud)
我误导/错误/错误吗?关于JS文字,基元和字符串/对象/数组/等,我需要了解什么?
数组/对象是伪装的字符串吗?为什么/为什么不呢?他们以什么方式(这样/不是)?
JS对象:
var saver = {
title: false,
preview: false,
body: false,
bottom: false,
locale: false
};
Run Code Online (Sandbox Code Playgroud)
问题是如何检查所有值是否为假?
我可以使用$ .each()jQuery函数和一些标志变量,但是可能有更好的解决方案?
看起来"$ smth不是函数"是一个非常常见的JavaScript问题,但在查看了很多线程后,我仍然无法理解在我的情况下导致它的原因.
我有一个自定义对象,定义为:
function Scorm_API_12() {
var Initialized = false;
function LMSInitialize(param) {
errorCode = "0";
if (param == "") {
if (!Initialized) {
Initialized = true;
errorCode = "0";
return "true";
} else {
errorCode = "101";
}
} else {
errorCode = "201";
}
return "false";
}
// some more functions, omitted.
}
var API = new Scorm_API_12();
Run Code Online (Sandbox Code Playgroud)
然后在另一个脚本中,我尝试以下列方式使用此API:
var API = null;
function ScormProcessInitialize(){
var result;
API = getAPI();
if (API == null){
alert("ERROR - Could not …Run Code Online (Sandbox Code Playgroud) 我有两个对象数组:
我的表的元素不是原始值,而是复杂的对象.
array1 = [obj1,obj2,obj3,obj4]
array2 = [obj5,obj5,obj6,obj7]
Run Code Online (Sandbox Code Playgroud)
我想比较两个数组,看看数组2的元素已经存在于array1中,然后创建一个新的差异数组.
有什么建议吗?
javascript ×10
arrays ×4
ecmascript-6 ×2
lodash ×2
jquery ×1
json ×1
nested ×1
object ×1
oop ×1