小编Tom*_*rdt的帖子

Javascript是基于原型的语言是什么意思?

据说Javascript的一个主要优点是它是一种基于原型的语言.

但是,Javascript基于原型是什么意思,为什么这是一个优势呢?

javascript oop inheritance prototype-programming

247
推荐指数
7
解决办法
5万
查看次数

使用Prototype在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()的结果并交叉引用另一个,但这是一个黑客,我相信有一个正确的方法来做到这一点!

javascript prototypejs

89
推荐指数
2
解决办法
10万
查看次数

Javascript继承:调用超级构造函数还是使用原型链?

最近我读到了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 inheritance call chaining prototype-programming

78
推荐指数
3
解决办法
8万
查看次数

JavaScript继承:当构造函数有参数时

使用纯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继承.

有什么建议?

谢谢!

javascript inheritance prototype-programming

46
推荐指数
4
解决办法
1万
查看次数

原型在JavaScript中是不是很糟糕?

Felix的Node.js风格指南中,它说:

不要扩展任何对象的原型,尤其是原生对象.如果你不遵守这条规则,地狱里有一个特殊的地方在等你.

这篇文章也让我质疑原型的用途.如果您稍后要在代码中添加方法,为什么不在原始构造函数中添加它?

那么,何时需要扩展对象的原型?

javascript node.js prototype-programming

16
推荐指数
1
解决办法
2384
查看次数

使用'instanceof function(){}'的原因是什么?

在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)

javascript bind function instanceof prototype-programming

15
推荐指数
1
解决办法
1363
查看次数

将构造函数传递给Array.map?

我该怎么做这样的事情:

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)

结果相同.

javascript arrays constructor map prototype-programming

14
推荐指数
2
解决办法
4379
查看次数

以不可检测/可逆的方式更改Window.prototype.open

我正在研究如何从扩展中扩展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

14
推荐指数
2
解决办法
8757
查看次数

Jquery + Rails有问题,是真的吗?

我在上一个问题中看到了评论,说最好使用Prototype with Rails.但是,我自己的经验是Jquery是一个优秀的Javascript库.作为Rails的新手,我还没有研究过如何在Rails中使用Jquery,但我认为这样可行.这可能是一个有问题的组合 - 特别是与Ajax有关 - 并且我可能需要使用Prototype吗?这是正确的吗?

javascript jquery ruby-on-rails prototypejs

13
推荐指数
3
解决办法
1687
查看次数

使用Prototype将div从一个div内部移动到另一个div?

在原型或普通但跨浏览器兼容的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 prototypejs

13
推荐指数
1
解决办法
5万
查看次数