对jsproto和分配新属性感到困惑
Confused about js proto and assigning new properties
我有一个简单的对象(实际上是Sencha Touch中的一个按钮)。它在一个名为"something.aButton()"的对象中;
此对象包含一个名为"view"的属性,其值为"home";
现在我想把它分配给一个变量,分配一些新的属性并传递它
所以我做了:
var c = something.aButton();
现在我分配更多的东西:
c.id = 4;
c.class = 'class';
现在的问题是,除非我这样做,否则c.view是未定义的:
c.view = c.view;
来自PHP世界的东西让我很困惑。我了解原型的基本知识,但不明白如何简单地将对象分配给一个变量,以便于使用和工作。我也不知道所有的原始属性,所以在我的代码中这样重新分配它是不可能的,我怀疑这是正确的方式。
如果我把"c"转储到我的控制台,我会看到:
Ext.Object.classify.objectClass
class: "class"
id: 4
__proto__: Object
view: 'home'
....
现在我分配更多的东西:
c.id = 4; c.class = 'class';
我会避免使用标识符class
。这是JavaScript第三版中的保留字;松散的";第5版中的(非严格)代码。
现在的问题是,除非我这样做,否则c.view是未定义的:
c.view = c.view;
它不是未定义的。您要更改的是c
拥有view
属性的自己的副本。如果你只做了console.log(c.view)
,你会在控制台中看到它的值,即使没有做上面的赋值。
原型在JavaScript中的工作方式是由原型以live的方式备份对象。因此,如果从c
中获取view
的值,并且c
没有其自己的属性view
,则会检查其原型链。但是,如果在c
上为view
分配一个值,则c
将获得其自己的属性,并使用该名称,您可以在对象转储等中看到它。
这里有一个简化的例子:
function Foo() {
}
Foo.prototype.bar = "42";
var f = new Foo();
console.log(f.bar); // "42"
目前,我们的对象图如下:
+----------------++---------------+|f|----->|Foo.prototype||-----------||---------------||||bar:"42"|+-----------++----------------+
所以我们有了f
,它得到了原型Foo.prototype
的支持。当我们向f
请求属性bar
时,由于f
没有自己的名称属性,JavaScript引擎会查看其原型,看看它是否有。如果是,则使用该值。(如果原型有原型,这种情况还会继续。)
现在假设我们这样做:
f.bar = "43";
console.log(f.bar); // "43"
因为f
现在有自己的bar
属性,JavaScript引擎使用该属性的值。现在我们的图表如下:
+----------------++---------------+|f|----->|Foo.prototype||-----------||---------------||bar:"43"|| bar:"42"|+-----------++----------------+
我们可以删除f
的属性:
delete f.bar; // `delete` removes "own" properties from objects
console.log(f.bar); // "42"
因此,从f
检索bar
再次看起来像原型,因为f
没有名为bar
的属性。我们回到了原始的对象图:
+----------------++---------------+|f|----->|Foo.prototype||-----------||---------------||||bar:"42"|+-----------++----------------+
现在有趣的一点是:假设我们更改原型的属性?
Foo.prototype.bar = "baz";
console.log(f.bar); // "baz"
因为f
没有bar
属性,所以引擎会查看原型。这就是我所说的一个实时系统。
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- 锚点元素的href属性自动更改
- jQuery最近父级的数据属性选择器
- 对jsproto和分配新属性感到困惑