在Bluebird的util.js文件中,它具有以下功能:
function toFastProperties(obj) {
/*jshint -W027*/
function f() {}
f.prototype = obj;
ASSERT("%HasFastProperties", true, obj);
return f;
eval(obj);
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,在返回函数之后有一个声明,我不知道它为什么存在.
同样,它似乎是故意的,因为作者已经沉默了JSHint对此的警告:
'return'后无法访问'eval'.(W027)
这个功能到底是做什么的?难道util.toFastProperties真的让一个对象的属性"快"?
我在Bluebird的GitHub存储库中搜索了源代码中的任何注释或者问题列表中的解释,但我找不到任何注释.
从标准 setPrototypeOf函数的MDN文档 以及非标准属性: __proto__
强烈建议不要改变对象的[[Prototype]],无论如何实现,因为它非常慢并且不可避免地减慢了现代JavaScript实现中后续执行的速度.
使用Function.prototype添加属性是在添加成员函数JavaScript类的方式.然后如下所示:
function Foo(){}
function bar(){}
var foo = new Foo();
// This is bad:
//foo.__proto__.bar = bar;
// But this is okay
Foo.prototype.bar = bar;
// Both cause this to be true:
console.log(foo.__proto__.bar == bar); // true
Run Code Online (Sandbox Code Playgroud)
为什么foo.__proto__.bar = bar;不好?如果它的坏不是Foo.prototype.bar = bar;那么糟糕?
那么为什么会出现这样的警告:它非常缓慢并且不可避免地减慢了现代JavaScript实现中后续执行的速度.当然Foo.prototype.bar = bar;不是那么糟糕.
更新也许通过突变他们意味着重新分配.见接受的答案.
function Person() {
var self = this;
self.personName="";
self.animals=[];
}
function Animal(){
var self=this;
self.animalName="";
self.run=function(meters){
.....
}
}
Run Code Online (Sandbox Code Playgroud)
服务器响应:
[{personName:John,animals:[{animalName:cheetah},{animalName:giraffe}]} , {personName:Smith,animals:[{animalName:cat},{animalName:dog}]} ]
Run Code Online (Sandbox Code Playgroud)
我从服务器获取Person数组.我想将通用Person数组转换为类型Person数组.所以我可以使用
persons[0].Animals[2].Run();
Run Code Online (Sandbox Code Playgroud)
我创建了Javascript
Object.create(Person,person1);
Run Code Online (Sandbox Code Playgroud)
但我希望它的跨浏览器版本支持阵列
ObjectArray.create(Person,persons);
Run Code Online (Sandbox Code Playgroud)
要么
Object.create(Person[],persons);
Run Code Online (Sandbox Code Playgroud)