为什么原型链的执行方式不同
Why is the prototype chain being executed differently?
我正在努力学习更多关于Javascript的知识,并深入研究原型链。当我遇到这个问题时,我想为HTMLElement创建一个小的扩展。
我理解Object.create
的方式是,传递给它的对象用于创建新对象的上下文,并且新创建的对象的原型链中的第一个链接将指向传递给Object.create
方法的对象。在这种情况下,下面bar
方法中使用的扩展方法对我来说似乎是正确的方法,因为这个新创建的对象将被赋予其HTMLElement作为其上下文。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<span id="test"></span>
<script>
HTMLElement.prototype.foo = function() {
let foo = Object.create(null);
foo.parentElement = this;
foo.parentElement.appendChild(document.createElement('div'));
}
HTMLElement.prototype.bar = function() {
let fooRenderer = Object.create(this);
fooRenderer.appendChild(document.createElement('div'));
}
document.getElementById('test').foo();
document.getElementById('test').bar();
</script>
</body>
</html>
然而,foo
方法通过向<span id="test"></span>
添加一个新的div
子元素而正常工作,但bar
则不然。
当我在浏览器中打开开发人员工具,并尝试遵循调用appendChild
的两个对象的原型链时,它们看起来几乎相同:
foo Object
.parentElement <span#test2>
.__proto__ HTMLSpanElementPrototype
.__proto__ HTMLElementPrototype
.__proto__ ElementPrototype
.__proto__ NodePrototype
.appendChild
.__proto__ EventTargetPrototype
.__proto__ Object
.__proto__
get
set
fooRenderer Object
.__proto__ <span#test2>
.__proto__ HTMLSpanElementPrototype
.__proto__ HTMLElementPrototype
.__proto__ ElementPrototype
.__proto__ NodePrototype
.appendChild
.__proto__ EventTargetPrototype
.__proto__ Object
.__proto__
get
set
我用这个例子创建了一个jsFiddle。
有人能向我解释一下bar
不工作的原因吗?bar
实际上是更正确的方法吗?如果是,应该如何设置才能正常工作
提前感谢您的帮助!!!
这两个例子都不是"正确的"。在原型方法中,你不应该试图实例化你已经连接到的对象的新副本。你所需要做的就是:
HTMLElement.prototype.bar = function() {
let div = document.createElement('div');
div.innerHTML = 'fooRenderer';
this.appendChild(div);
}
第一个例子之所以有效,是因为foo.parentElement
将是一个有效的本地HTMLElement,而不是一个自定义创建的对象。
关于为什么不能在自定义对象上调用appendChild
之类的"本机"浏览器方法,请参阅以下答案。
相关文章:
- 虽然循环不执行或不循环
- 不执行包含的页面的Javascript onload函数
- jQuery/Javascript foreach If/Else |如果为空(不执行任何操作)Else(显示forea
- 控制台.log触发,但随后的 Jquery 调用不执行任何操作
- 为什么 .on() 方法不执行第一个处理程序
- 当输入为变量时,.replace.不执行任何操作
- jQuery的工作方式不一样
- Rails 4中不执行Ajax响应
- 节点命令不执行星号路径
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- JavaScript 函数不执行
- 如果未输入任何内容,则使 JavaScript 按钮不执行任何操作
- Firefox 在应该执行的时候不执行 JavaScript
- 带有远程 => true 的 Rails 表单提交 -- JS 文件呈现但不执行
- 在不执行ajax请求的情况下,使用jQuery读取HTTP标头以检查404
- 脚本执行,但代码隐藏不执行
- 浏览器没有'我向后移动时不执行javascript
- Javascript数学不起作用,更好的方式来执行操作
- jquery的执行方式不正确
- 更好的JavaScript组织和执行不引人注目的方式——自动执行匿名函数