假设我的foo
JavaScript代码中有一个对象。 foo
是一个复杂的对象,它在其他地方生成。如何更改foo
对象的原型?
我的动机是为从.NET到JavaScript文字序列化的对象设置适当的原型。
假设我已经在ASP.NET页面中编写了以下JavaScript代码。
var foo = <%=MyData %>;
假设这MyData
是在对象JavaScriptSerializer
上调用.NET的结果Dictionary<string,string>
。
在运行时,它将变为以下内容:
var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];
如您所见,foo
成为对象的数组。我希望能够foo
使用适当的原型进行初始化。我 不是
要修改Object.prototype
,也没有Array.prototype
。我怎样才能做到这一点?
编辑2012年2月:下面的答案不再准确。 __proto__被作为“标准可选”添加到ECMAScript
6中,这意味着它不需要实施,但如果要实施,则必须遵循给定的规则集。目前尚无定论,但至少它将正式成为JavaScript规范的一部分。
这个问题比表面上看起来要复杂得多,而且就Java组件内部知识而言,这超出了大多数人的薪水等级。
在prototype
创建该对象的新的子对象时,对象的属性使用。更改它不会反映在对象本身中,而是在将该对象用作其他对象的构造函数时反映出来,并且在更改现有对象的原型时没有用。
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
对象具有指向当前原型的内部[[prototype]]属性。它的工作方式是:只要调用对象的属性,它将从该对象开始,然后遍历[[prototype]]链,直到在根Object原型之后找到匹配项或失败为止。这就是Javascript允许运行时构建和修改对象的方式。它有一个搜索所需内容的计划。
该__proto__
属性存在于某些实现中(现在有很多):任何Mozilla实现,我所知道的所有Webkit实现,其他一些实现。此属性指向内部[[prototype]]属性,并允许在对象创建后进行修改。由于这种链式查找,任何属性和功能都将立即切换以匹配原型。
此功能虽然现在已标准化,但仍不是JavaScript的必需部分,并且在支持该功能的语言中,很有可能会将您的代码归为“未优化”类别。JS引擎必须尽最大努力对代码进行分类,尤其是经常访问的“热”代码,如果您正在做诸如修改之类的事情__proto__
,它们将根本无法优化您的代码。
专门讨论的当前实现__proto__
以及它们之间的区别。每个实现都有不同的实现方式,因为这是一个棘手且尚未解决的问题。Java语言中的所有内容都是可变的,除了a。)语法b。)宿主对象(DOM在技术上不在Javascript之外)和c。)__proto__
。其余的一切完全掌握在您和所有其他开发人员的手中,因此您可以看到为什么__proto__
伸出来就像拇指酸痛一样。
有一件事情__proto__
可以做到,而这在其他方面是不可能做到的:在运行时指定对象原型与其构造函数分开。这是一个重要的用例,也是__proto__
尚未死亡的主要原因之一。非常重要的一点是,这已成为和声制定中的一个重要讨论点,或即将被称为ECMAScript6。在创建过程中指定对象原型的能力将成为下一版Javascript的一部分,而这将是表示__proto__
日期的铃铛已正式编号。
在短期内,__proto__
如果您要定向支持它的浏览器(不是IE,而且永远不会有IE),就可以使用。由于ES6直到2013年才能最终定稿,因此它可能会在接下来的10年中在webkit和moz中使用。
很抱歉,但是可设置__proto__
,除了对象初始化程序的用例之外(例如,在尚无法访问的新对象上,类似于ES5的Object.create),这是一个可怕的想法。我写这是__proto__
在12年前设计并实现可设置的。
…缺乏分层是一个问题(考虑JSON数据和一个key"__proto__"
)。更糟糕的是,可变性意味着实现必须检查循环原型链,以避免循环。需要不断检查无限递归
最后,__proto__
在现有对象上进行更改可能会破坏新原型对象中的非泛型方法,而该方法可能无法在__proto__
正在设置其的接收者(直接)对象上工作。通常,这只是一种不好的做法,是一种故意的类型混淆。
本文向大家介绍举例说明JavaScript中的实例对象与原型对象,包括了举例说明JavaScript中的实例对象与原型对象的使用技巧和注意事项,需要的朋友参考一下 首先声明:javascript中每个对象都有一个constructor属性和一个prototype属性。constructor指向对象的构造函数,prototype指向使用构造函数创建的对象实例的原型对象。 在这段代码中会报错,sayN
问题内容: JavaScript中有一个对象。我想实例化一个用于测试目的。 我已经尝试过,但是出现“非法构造函数”错误。 是否可以创建对象? 问题答案: 根据W3C File API规范,File构造函数需要2(或3)个参数。 因此,要创建一个空文件,请执行以下操作: 第一个参数是作为文本行数组提供的数据; 第二个参数是文件名; 第三个参数如下: 它适用于FireFox,Chrome和Opera,
问题内容: 用语言很难解释这种情况,让我举一个例子: 如何在JavaScript对象中设置具有变量值的变量属性? 问题答案: 那应该工作。您混合了变量的名称及其值。但是用字符串索引对象以获取其属性可以在JavaScript中很好地工作。
我是一个初学者/中级AS3“程序员”,试图为大学评估完成一个类似skeeball的基于flash的游戏,我正在给自己造成严重的精神伤害,试图让基本的物体(球)碰撞在我的舞台上与得分目标一起工作。我正在使用一个功率条类型的变量来确定球滚动的力,该变量被转换为一个吐温,以创建一个顺畅的移动,沿着我的“车道”进入得分区域(这是头顶视角)。目标是由游戏桌的所有组件组成的更大电影剪辑中的电影剪辑实例。即使我
在我的ASP.NET程序中。我设置了一个受保护的列表。我在列表中添加了一个值。但它显示对象引用未设置为对象错误的实例 如何解决这个错误?
我需要将一些html转换为PDF。我遇到了IText7,它看起来是一个很好的解决方案。 我正在. net core 3.1中开发 但是,即使使用它的基本实现,我也会遇到一个错误: 每个人都喜欢这个错误: 对象引用未设置为对象的实例。 内部异常为null,唯一的线索是SerializationStackTraceString是: 在iText. IO. FontCache. cctor() 那么,它