据说Javascript的一个主要优点是它是一种基于原型的语言.
但是,Javascript基于原型是什么意思,为什么这是一个优势呢?
有没有办法使用Prototype JavaScript框架迭代对象的每个属性?
情况就是这样:我在JSON中得到一个AJAX响应,如下所示:
{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}
Run Code Online (Sandbox Code Playgroud)
如果我将json响应评估为变量response,我希望能够遍历response.barobj对象中的每个属性,以查看哪些索引为true,哪些为false.
原型有两种Object.keys(),Object.values()但奇怪似乎没有一个简单的Object.each()功能!当我迭代一个时,我可以获取Object.keys()和Object.values()的结果并交叉引用另一个,但这是一个黑客,我相信有一个正确的方法来做到这一点!
最近我读到了MDC中的JavaScript调用用法
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
如下所示的一个例子,我仍然不明白.
他们为什么在这里使用继承呢?
Prod_dept.prototype = new Product();
Run Code Online (Sandbox Code Playgroud)
这有必要吗?因为有一个超级构造函数的调用
Prod_dept()
Run Code Online (Sandbox Code Playgroud)
无论如何,像这样
Product.call
Run Code Online (Sandbox Code Playgroud)
这只是出于常见的行为吗?何时使用超级构造函数调用或使用原型链更好?
function Product(name, value){
this.name = name;
if(value >= 1000)
this.value = 999;
else
this.value = value;
}
function Prod_dept(name, value, dept){
this.dept = dept;
Product.call(this, name, value);
}
Prod_dept.prototype = new Product();
// since 5 is less than 1000, value is set
cheese = new Prod_dept("feta", 5, "food");
// since 5000 is above 1000, value will be 999
car = new Prod_dept("honda", 5000, "auto");
Run Code Online (Sandbox Code Playgroud)
谢谢你让事情更清楚
使用纯JavaScript进行继承,这是我通常做的事情:
function A() {}
A.prototype.run = function () {};
function B() {}
B.prototype = new A;
B.prototype.constructor = B;
Run Code Online (Sandbox Code Playgroud)
由于没有参数传递给构造函数,新的A没有什么可抱怨的.现在,如果构造函数有要传递的参数,我还没有想出一个很好的继承方法.例如,
function A(x, y) {}
A.prototype.run = function () {};
function B(x, y) {}
B.prototype = new A;
B.prototype.constructor = B;
Run Code Online (Sandbox Code Playgroud)
我可以传递一些任意值,如:
B.prototype = new A(null, null);
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我可能需要在A的构造函数中验证x和y.在某些极端情况下,我在检查x或y时需要抛出错误.然后,B无法使用新的A从A继承.
有什么建议?
谢谢!
不要扩展任何对象的原型,尤其是原生对象.如果你不遵守这条规则,地狱里有一个特殊的地方在等你.
这篇文章也让我质疑原型的用途.如果您稍后要在代码中添加方法,为什么不在原始构造函数中添加它?
那么,何时需要扩展对象的原型?
在Mozilla开发人员中心,有一个关于该Function.prototype.bind功能的页面,并为不支持此功能的浏览器提供兼容性功能.
但是,在分析此兼容性代码时,我无法找出它们使用的原因instanceof nop.nop已经设定为function() {}.ECMA规范的哪一部分与bind此相对应?什么变量是一个实例function() {}?
以下返回false,因此我不完全知道它的用途.在做instanceof function() {}检查时会发生什么事情?
(function() {}) instanceof (function() {}) // false
Run Code Online (Sandbox Code Playgroud)
代码如下:
Function.prototype.bind = function( obj ) {
if(typeof this !== 'function')
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
var slice = [].slice,
args = slice.call(arguments, 1),
self = this,
nop = function () {},
bound = function () {
return self.apply( this instanceof …Run Code Online (Sandbox Code Playgroud) 我该怎么做这样的事情:
var a = [1,2,3,4];
a.map(Date.constructor);
Run Code Online (Sandbox Code Playgroud)
此代码在Google V8上引发错误:
SyntaxError: Unexpected number
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
a.map(Date.constructor, Date.prototype)
Run Code Online (Sandbox Code Playgroud)
结果相同.
我正在研究如何从扩展中扩展Firefox弹出窗口阻止.一种选择是通过包装函数替换window.open()(或更确切地说Window.prototype.open())网页.一个重要的要求是网页无法检测或恢复此操作.例如,如果我只是这样做:
Window.prototype.open = wrapper;
Run Code Online (Sandbox Code Playgroud)
通过执行以下操作,网页可以轻松恢复更改:
delete Window.prototype.open;
Run Code Online (Sandbox Code Playgroud)
相反,我可以使用Object.defineProperty()来设置高级属性标志:
Object.defineProperty(Window.prototype, "open", {value: wrapper, configurable: false});
Run Code Online (Sandbox Code Playgroud)
网页无法再恢复此更改,但它仍然可以检测到它:delete Window.prototype.open通常会更改Window.prototype.open(看起来相同功能的不同实例)的值,这里delete根本不会产生任何影响.此外,Window.prototype.open = "test";delete Window.prototype.open;将产生不一致的结果(不同的结果取决于是否writable: false为属性指定了标志).
还有什么我可以做的来模仿原始属性的行为(没有使用二进制XPCOM组件,它有太多自己的问题)?
javascript firefox firefox-addon firefox4 prototype-programming
我在上一个问题中看到了评论,说最好使用Prototype with Rails.但是,我自己的经验是Jquery是一个优秀的Javascript库.作为Rails的新手,我还没有研究过如何在Rails中使用Jquery,但我认为这样可行.这可能是一个有问题的组合 - 特别是与Ajax有关 - 并且我可能需要使用Prototype吗?这是正确的吗?
在原型或普通但跨浏览器兼容的Javascript中,如何将div的内容移动到另一个div的内容?
div内部是一个带有id的表单和具有事件观察者的依赖Javascript代码.我不希望这个因为我在DOM中移动了一个块而中断.'innerHTML = innerHTML'解决方案不是我想要的.在加载DOM时我也需要这样做.
我想离开这个:
<div id='here'>
<div id='MacGuffin'>
<p>Hello Worlds!</p>
</div>
</div>
<div id='there'>
</div>
Run Code Online (Sandbox Code Playgroud)
对此:
<div id='here'>
</div>
<div id='there'>
<div id='MacGuffin'>
<p>Hello Worlds!</p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
...当文件加载时没有任何跳跃.
javascript ×10
inheritance ×3
prototypejs ×3
arrays ×1
bind ×1
call ×1
chaining ×1
constructor ×1
firefox ×1
firefox4 ×1
function ×1
instanceof ×1
jquery ×1
map ×1
node.js ×1
oop ×1