- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我总是被告知“类只是原型(prototype)的语法糖。”
但在这个例子中,这表明这不是真的。
function SubArray() {}
SubArray.prototype = new Array( );
console.log(Array.isArray(new SubArray())) // false
以及类的相同示例。
SubArray = class extends Array{}
console.log(Array.isArray(new SubArray())) // true
有趣的是,instanceof
在 new SubArray instanceof Array
上都能正常工作。为什么 Array.isArray
不返回带有原型(prototype)的 true
?
最佳答案
那是因为你没有写class
实际上是语法糖的代码:
function SubArray () {
if (!(new.target)) {
throw new TypeError("Class constructor SubArray cannot be invoked without 'new'")
}
return Reflect.construct(Array, arguments, new.target)
}
Object.setPrototypeOf(SubArray.prototype, Array.prototype)
Object.setPrototypeOf(SubArray, Array)
console.log(Array.isArray(new SubArray())) // true
上面的行为应该与您使用 class
语法提供的示例相同。不幸的是,如果没有其他 ES6 构造(例如 new.target
和 Reflect.construct()
),并非所有这些行为都可以准确地重现,但至少这些行为不一定需要顺序产生你想要的行为:
function SubArray () {
if (!(this instanceof SubArray)) {
throw new TypeError("Class constructor SubArray cannot be invoked without 'new'")
}
return Array.apply(this, arguments)
}
SubArray.prototype = Object.create(Array.prototype)
// the line below is not necessary for Array.isArray()
// but accurately reproduces behavior of `class SubArray extends Array {}`
SubArray.__proto__ = Array // implementation hack if Object.setPrototypeOf() is not available
console.log(Array.isArray(new SubArray())) // true
这里的关键是将实例化对象的构造委托(delegate)给 Array
构造函数,以便将对象初始化为 Array 奇异对象。因此,假设严格需要的是以下内容:
function SubArray () {
return Array.call(this)
}
console.log(Array.isArray(new SubArray())) // true
当然,在这种情况下您将无法访问 Array.prototype
方法,因此您应该坚持使用 class
语法或第二个示例(如果有)支持 ES5。
我做了一些修改,我个人认为这是一个可怕的想法,但如果你想在 ES5 中尽可能地模拟 class
,你可以选择退出 strict mode
以便访问 arguments.caller
:
// DON'T ACTUALLY DO THIS
// just for demonstration purposes
function SubArray () {
// this is about as close as you can get to new.target in ES5
if (!(this instanceof SubArray) && !(arguments.caller && this instanceof arguments.caller)) {
throw new TypeError("Class constructor SubArray cannot be invoked without 'new'")
}
return Array.apply(this, arguments)
}
SubArray.prototype.__proto__ = Array.prototype
SubArray.__proto__ = Array
// we want FooBar to extend SubArray sloppily
function FooBar () {
if (!(this instanceof SubArray) && !(arguments.caller && this instanceof arguments.caller)) {
throw new TypeError("Class constructor FooBar cannot be invoked without 'new'")
}
return SubArray.apply(this, arguments)
}
FooBar.prototype.__proto__ = SubArray.prototype
FooBar.__proto__ = SubArray
try {
SubArray()
} catch (e) {
console.log(e.toString())
}
console.log(new SubArray(1, 2, 3))
try {
FooBar()
} catch (e) {
console.log(e.toString())
}
console.log(new FooBar(1, 2, 3))
关于javascript - 类与原型(prototype) Array.isArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51268495/
它们看起来是一样的。 在内部 jQuery 只是将它自己的 $.isArray 映射到原生的 Array.isArray。* 最佳答案 经过进一步调查,我发现 this commit他们用原生的 Ar
我刚刚注意到 Node.js v0.10.26 的 API 文档提供 util.isArray, util.isArray(object)# Returns true if the given "ob
我正在使用 Backbone 、requirejs 和 yeoman 构建一个应用程序。 我使用 Twitter 的 typeaheadjs 并随机收到此错误!大多数时候它可以工作,但有时提前输入甚至
我正在映射组件中配置文件中的某些项目,如果一个项目是一个数组,我想将数组中的每个值一起渲染。我正在使用 .isArray 来检查某个项目是否是数组,但它没有在我期望的时候返回值。 示例配置 items
范围:我一直在学习 java 脚本中的原型(prototype)继承,并在我的网络浏览器中尝试了以下代码。在执行以下代码时,我发现了一些非常有趣的东西。 let animal = { eats:
对于这个大量数据,我只想匹配数组字段。但我想要$match出项目。 这是数据样本: /* 1 */ { "_id" : ObjectId("5df8b596400289966e77e268")
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在尝试检查是否是p数组。我是想检查真实性还是我在哪里犯了错误。其实现在我正在学习jQuery.isArray 。我认为我的代码出错了,但我不知道在哪里。谢谢 var p = ['foo',''];
这是我的首页 {{items}} 这是我的 Controller app.controller('mainController', function($scop
这个问题在这里已经有了答案: How do I check if a variable is an array in JavaScript? (25 个答案) 关闭 9 年前。 我想检查一个变量是数
我很好奇为什么IE8会卡死 if (isArray(obj)) 这是我在 IE8 javascript 控制台中得到的: >>obj {...} >>typeof(obj) "object" >>Ob
我在玩 NG2,我正在寻找 angular.isArray 的等价物。 是的,我尝试用谷歌搜索但没有成功。我可能正在考虑这个问题。 我尝试在我的 ng2-app 中使用的方法是这样的: functio
IsArray 函数 返回 Boolean 值指明某变量是否为数组。 IsArray(varname) varname 参数可以是任意变量。 说明 如果变量是数组,IsArray 函数返回
我试图在 TypeScript 中做一个简单的数组检查,但显然它所做的是推断如果它不是一个数组(它实际上接受 any 类型作为参数),那么它必须是 never 类型。我很好奇这在 TypeScript
所以我一直在尝试调试我正在编写的物理引擎,对于多维空间 HashMap ,我需要分配一个二维数组。 为什么这段代码给我“无法读取未定义的属性‘push’”?我的 if 语句和我尝试推送到数组之间是否发
我正在浏览 polyfill MDN 上的 Array.isArray 方法,这是我发现的: if (!Array.isArray) { Array.isArray = function(arg)
我有一个关于 Java Reflections 的问题:我必须检查类的某个字段是否是数组。但我的问题是:如果我直接在类的属性上运行 isArray() ,它就可以工作。但是如果我按照下面的方式使用它,
我一直在用 Javascript 阅读: 一切都是对象(数字、字符串、 bool 值、null 和未定义等基本类型除外) 对象可以被视为关联数组。 根据我的结论,Array.isArray() 应该为
如何确定我的数据结构是 Map() 类型? 我到处找,没找到方法 我真的很想开始使用它们,因为我可以使用对象作为键! 最佳答案 您可以使用 instanceof 运营商 var map = new M
我是一名优秀的程序员,十分优秀!