标签: ecmascript-5

访问者描述符:如何在实践中使用"获取"和"设置"?

我不确定我是否做对了.

这个例子直接来自MDN(Mozilla Developer Network):

var bValue;  
Object.defineProperty(o, "b", {get : function(){ return bValue; },  
                               set : function(newValue){ bValue = newValue; },  
                               enumerable : true,  
                               configurable : true});  
Run Code Online (Sandbox Code Playgroud)

会发生什么 - 它创建了一个名为bValue的全局变量,但未完成.我知道这个例子只展示了它的使用,因此它可以创建一个全局变量.但是,如果我要在应用程序中使用它,我将通过添加this关键字稍微修改它:

Object.defineProperty(o, "b", {get : function(){ return this.bValue; },  
                               set : function(newValue){ this.bValue = newValue; },  
                               enumerable : true,  
                               configurable : true}); 
Run Code Online (Sandbox Code Playgroud)

现在,该对象o将具有属性b,同时它还将具有另一个属性bValue.用户(程序员)将仅暴露于'b'而不是'bValue',尽管他仍然可以直接访问bValue - 我看不出它是如何被阻止的.

我理解属性b和属性bValue可能并不总是相同,但b取决于值,bValue因为getter和setter允许我们在赋值之前预处理bValue b.

主要问题是,我做对了吗?或者我在这里遗漏了什么?

javascript get set getter-setter ecmascript-5

3
推荐指数
1
解决办法
2232
查看次数

在JavaScript/ActionScript中重新定义Math.constructor是否有任何实际用途?

Math对象没有prototype属性,但具有构造函数属性.有没有重新定义构造函数有用的情况?

javascript constructor actionscript ecmascript-5 jscript

3
推荐指数
2
解决办法
1785
查看次数

严格模式下的全局对象访问

请考虑以下代码段:

var global = (function(){
    return this;
}());
Run Code Online (Sandbox Code Playgroud)

当执行global时将指向window浏览器中的对象.
但这在严格模式下不起作用.为什么?

javascript ecmascript-5

3
推荐指数
1
解决办法
1581
查看次数

"use strict"是否适用于在严格范围内声明的函数?

我在jshint中得到这个,

[L16:C13] W034:不必要的指令"use strict".

不过我的问题是做这样的工作..

function () {
    "use strict";

    var a = function () {
        //stuff, (is this also strict)
    }

}
Run Code Online (Sandbox Code Playgroud)

东西严格吗?显然,严格声明之外的事情并不严格.但是其他函数内部是否开始非严格或继承严格性?

javascript ecmascript-5

3
推荐指数
1
解决办法
348
查看次数

有没有办法只得到未命名的参数?

在JavaScript函数中,arguments是一个类似于数组的对象,包含函数的所有参数,无论它们是否被命名:

function f(foo, bar) {
    console.log(arguments);
}
f(1, '2', 'foo'); // [1, "2", "foo"]
Run Code Online (Sandbox Code Playgroud)

有没有办法获取未命名的参数,所以你可以做这样的事情?

function f(foo, bar) {
    console.log('foo:', foo, 'bar:', bar, 'the rest:', unnamedArguments);
}
f(1, '2', 'foo'); // foo: 1 bar: "2" the rest: ["foo"]
Run Code Online (Sandbox Code Playgroud)

但为什么?

一个真实的用例是将Angular模块作为参数注入RequireJS模块:

define([
    'angular',
    'myLibModule', // Exports an Angular module object
    'myOtherLibModule', // Exports an Angular module object
], function(angular, myLibModule, myOtherLibModule) {
    angular.module('MyApp', [myLibModule.name, myOtherLibModule.name]);
});
Run Code Online (Sandbox Code Playgroud)

由于模块依赖关系列表可能会非常大,因此很快变得非常麻烦.虽然我可以解决它

define([
    'angular',
    'underscore',
    'myLibModule', // Exports an Angular module object …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-5

3
推荐指数
1
解决办法
1000
查看次数

不能.join()函数参数 - TypeError:undefined不是函数

最小例子:

function test() {
  console.log(arguments.join(','));
}

test(1,2,3);
Run Code Online (Sandbox Code Playgroud)

然后我得到:

TypeError:undefined不是函数

但是,当我对数组执行相同操作时:

console.log([1,2,3].join(','));
Run Code Online (Sandbox Code Playgroud)

我明白了

"1,2,3"

正如所料.

这个问题有什么不对?它假设是一个数组:

(function () {
  console.log(typeof [] == typeof arguments)
})();
Run Code Online (Sandbox Code Playgroud)

真正

javascript v8 node.js ecmascript-5

3
推荐指数
1
解决办法
2799
查看次数

分配给在ES5中作为参数传递的对象

我有一个对象,我作为参数传递给函数.在该函数内部我想为它赋予一个不同的值,但是因为在函数内部我们只引用了原始对象,所以我们不能使用简单赋值=.

在ES2015中,我可以使用Object.assign

除了将属性复制到引用之外,是否有我可以在ES5中使用的解决方法?

以下是https://jsbin.com/wimuvaqosi/1/edit?js,console的示例

var x = {prop:1};

function foo(x1) {
  var y = {prop:2};
  x1 = y; //this obviously does not work
  //x1 = Object.assign(x1, y); //this works only in ES2015
}

foo(x);

console.log("x ", x);
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-5

3
推荐指数
1
解决办法
3141
查看次数

在ES5(而不是ES6)中创建自定义元素v1

现在,如果您遵循自定义元素specv1的确切规范,则不可能在不支持类的浏览器中使用自定义元素。

有没有一种方法可以创建v1自定义元素而不使用类语法,以使它们在Chrome,FireFox和IE11中完全起作用。另外,由于IE11不对自定义元素提供本机支持,所以我假设我们可能需要使用一些pollyfills,那么,为了在IE11中实现此功能,我们需要哪些polyfills或库?

我已经弄乱了Polymer 2,Polymer 3和Stencil,但是它们对于我们要创建的某些东西来说有点繁重。

这个问题似乎是在正确的轨道上,但是让它在IE11中工作时遇到了一些麻烦,因此,如何才能在IE11中使用Reflect.construct来实现自定义元素?

javascript web-component ecmascript-5 native-web-component

3
推荐指数
1
解决办法
1373
查看次数

如果babel将let和const转换为var,那有什么区别?

我已经尝试过babel转换器,它将All let,const和var转换为var,所以总的来说,我们的代码使用有什么不同?
我已经读过文件了,我知道let,const和var之间的区别是什么,但是如果所有这些文件最终都转换为var,那有什么区别?这意味着在性能甚至范围上不应该有任何有意义的差异!

更新(02.14.2019):根据我的理解,范围确实很重要,即使它们被转换为var,babel仍保留范围的含义.我的问题仍然是性能,是否有任何有意义的性能差异?

我附加了转换器的输入和输出,以及更复杂的场景
输入:

let a = 1;

for (let a = 0; a !== 0;) {
  for (let a = 0; a !== 0;) {}
}
Run Code Online (Sandbox Code Playgroud)

产量

"use strict";

var a = 1;

for (var _a = 0; _a !== 0;) {
  for (var _a2 = 0; _a2 !== 0;) {}
}
Run Code Online (Sandbox Code Playgroud)

javascript javascript-objects ecmascript-5 ecmascript-6 babeljs

3
推荐指数
1
解决办法
914
查看次数

使用回调方法将JavaScript函数转换为类

我正在尝试将以下函数转换为JavaScript中的类(来自此处创建的CMS的原始函数),

function Countdown(options) {
  var timer,
  instance = this,
  seconds = options.seconds || 10,
  updateStatus = options.onUpdateStatus || function () {},
  counterEnd = options.onCounterEnd || function () {};

  function decrementCounter() {
    updateStatus(seconds);
    if (seconds === 0) {
      counterEnd();
      instance.stop();
    }
    seconds--;
  }

  this.start = function () {
    clearInterval(timer);
    timer = 0;
    seconds = options.seconds;
    timer = setInterval(decrementCounter, 1000);
  };

  this.stop = function () {
    clearInterval(timer);
  };
}
Run Code Online (Sandbox Code Playgroud)

通过这种用法,

var myCounter = new Countdown({  
    seconds:5,  // number …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-5

3
推荐指数
1
解决办法
49
查看次数