我有一个构造函数,它注册一个事件处理程序:
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', function () {
alert(this.data);
});
}
// Mock transport object
var transport = {
on: function(event, callback) {
setTimeout(callback, 1000);
}
};
// called as
var obj = new MyConstructor('foo', transport);Run Code Online (Sandbox Code Playgroud)
但是,我无法data在回调中访问已创建对象的属性.它看起来this并不是指创建的对象,而是指另一个对象.
我还尝试使用对象方法而不是匿名函数:
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', this.alert);
}
MyConstructor.prototype.alert = function() {
alert(this.name);
};
Run Code Online (Sandbox Code Playgroud)
但它表现出同样的问题.
如何访问正确的对象?
是否可以通过实现其中的任何一个call或apply以其他方式使对象可调用?例如:
var obj = {};
obj.call = function (context, arg1, arg2, ...) {
...
};
...
obj (a, b);
Run Code Online (Sandbox Code Playgroud) 在ECMAScript 5(又名JavaScript)中,我可以通过"use strict"在函数顶部添加严格模式(或文件,但不鼓励这样做.)
据我所知,在ECMAScript 6中,某些语法功能会打开严格模式,尤其是class模块(不过你会这样做).
在ECMAScript 6世界中,触发严格模式的完整列表是什么?
function a () {
return "foo";
}
a.b = function () {
return "bar";
}
function c () { };
c.prototype = a;
var d = new c();
d.b(); // returns "bar"
d(); // throws exception, d is not a function
Run Code Online (Sandbox Code Playgroud)
有没有办法d成为一个函数,但仍然继承属性a?
如何在JavaScript中为可调用对象创建构造函数?
我尝试了各种各样的方式,比如跟随.这个例子只是缩短了实际对象的例子.
function CallablePoint(x, y) {
function point() {
// Complex calculations at this point
return point
}
point.x = x
point.y = y
return point
}
Run Code Online (Sandbox Code Playgroud)
这工作在第一,但它创建的对象不是实例CallablePoint,因此它不会从复制的属性CallablePoint.prototype,并说false上instanceof CallablePoint.是否可以为可调用对象创建工作构造函数?
MDN对于修改代码中的原型有一个巨大的可怕警告:
根据
[[Prototype]]现代JavaScript引擎如何在每个浏览器和JavaScript引擎中优化属性访问,非常慢的操作,改变对象的性质.对改变继承的性能的影响是微妙和遥远的,并不仅仅局限于在Object.setPrototypeOf(...)语句中花费的时间,而是可以扩展到任何可以访问任何[[Prototype]]已被更改的对象的代码 .如果您关心性能,则应避免设置[[Prototype]]对象.而是[[Prototype]]使用所需的使用创建一个新对象Object.create().
我想知道是否有任何情况你可以修改对象的原型而不会导致级联的优化效果,从而破坏程序的性能.好像应该有.例如,如果您只是在创建对象之后(以及在其他任何东西使用之前)修改原型.但我想这是依赖引擎的.
那么有谁知道是否有有效的方法来修改对象的原型?
编辑:这个问题的动机来自于创建实际继承的对象的愿望Function.我知道如何做到这一点的唯一方法是修改函数的原型.请参阅Raynos答案的最底部:javascript类继承自Function类
javascript inheritance prototype prototypal-inheritance prototype-chain
考虑以下ES6类:
'use strict';
class Dummy {
}
class ExtendDummy extends Dummy {
constructor(...args) {
super(...args)
}
}
class ExtendString extends String {
constructor(...args) {
super(...args)
}
}
const ed = new ExtendDummy('dummy');
const es = new ExtendString('string');
console.log(ed instanceof ExtendDummy);
console.log(es instanceof ExtendString);Run Code Online (Sandbox Code Playgroud)
我的理解是两者都应该是true,而且在Firefox和Chrome中它们都是,但是Node说的es instanceof ExtendString是false.它与其他构造函数相同,而不仅仅是String.
我使用的软件:
--harmony标志的节点v5.11.0 .哪个JavaScript引擎是正确的,为什么?
javascript ×7
ecmascript-6 ×2
inheritance ×2
callable ×1
callback ×1
constructor ×1
prototype ×1
this ×1