相关疑难解决方法(0)

在JavaScript中使用'prototype'与'this'?

有什么区别

var A = function () {
    this.x = function () {
        //do something
    };
};
Run Code Online (Sandbox Code Playgroud)

var A = function () { };
A.prototype.x = function () {
    //do something
};
Run Code Online (Sandbox Code Playgroud)

javascript prototype this

765
推荐指数
14
解决办法
11万
查看次数

使用原型的优点,直接在构造函数中定义方法?

我想知道使用这些中的任何一个是否有任何优势,我应该走哪条路?

构造方法:

var Class = function () {

    this.calc = function (a, b) {
        return a + b;
    };

};
Run Code Online (Sandbox Code Playgroud)

原型方法:

var Class = function () {};

Class.prototype.calc = function (a, b) {
    return a + b;
};
Run Code Online (Sandbox Code Playgroud)

我不喜欢这样,使用原型,方法定义与类分开,我不知道是否有任何特定的原因我应该使用它而不是第一种方法.

此外,使用函数文字定义"类"是否有任何好处,而不仅仅是函数定义:

var Class = function () {};
Run Code Online (Sandbox Code Playgroud)

VS

function Class () {};
Run Code Online (Sandbox Code Playgroud)

谢谢!

javascript oop prototype

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

Javascript原型操作员性能:节省内存,但速度更快吗?

在这里阅读(Douglas Crockford)使用原型运算符向Javascript类添加方法也保存了内存.

然后我读到了John Resig的文章 "用一堆原型属性实例化一个函数是非常非常快的 ",但他是在谈论以标准方式使用原型,还是他在他的文章中谈论他的具体例子?

例如,正在创建此对象:

function Class1()
{
   this.showMsg = function(string) { alert(string); }
}
var c = new Class1();
c.showMsg();
Run Code Online (Sandbox Code Playgroud)

创建这个对象吗?

function Class1() {}
Class1.prototype.showMsg = function(string) { alert(string); }
var c = new Class1();
c.showMsg();
Run Code Online (Sandbox Code Playgroud)

PS

我知道原型用于创建继承和单例对象等.但是这个问题与这些主题没有任何关系.


编辑:对于JS对象和JS静态对象之间的性能比较它可能感兴趣的人可以阅读下面的答案.静态对象肯定更快,显然只有在不需要多个对象实例时才能使用它们.

javascript performance function-prototypes

48
推荐指数
3
解决办法
2万
查看次数

在NodeJS中创建对象的推荐方法是什么?

我正在构建request模块的复合,但是我不确定在JS for Node中构建对象的最佳实践是什么.

选项1:

function RequestComposite(request) {
  return {
    get: function (url) { return request.get(url); }
  }
}
var comp = RequestComposite(request);
Run Code Online (Sandbox Code Playgroud)
  • 注意:我知道我应该以异步方式调用CB,但为了便于解释,我将其返回...

选项2:

function RequestComposite(request) {
  this.request = request;
}

RequestComposite.prototype.get = function (url) { return this.request.get(url); };
var comp = new RequestComposite(request);
Run Code Online (Sandbox Code Playgroud)

选项3:

var RequestComposite = {
  init: function (request) { this.request = request; },
  get: function (url) { return request.get(url); }
}
var comp = Object.create(RequestComposite).init(request);
Run Code Online (Sandbox Code Playgroud)

我试图找到自己的方式,但是我对如何使用对象更加困惑...

如果我想为浏览器使用对象,答案会有所不同吗?

谢谢.

javascript performance node.js javascript-objects

31
推荐指数
2
解决办法
6万
查看次数

原型污染与专用库对象的性能和记忆

不确定这是否是一个新问题所以如果你有任何问题,请参考任何好的来源.

我的团队正在开发一个大型的JS图表项目,我们继承了之前的开发人员,他们大量使用内置对象原型来添加可重用的代码.我们在Date,Object和其他内部对象中添加了许多新的实用程序函数,所以我猜他们就这样了,因为改变原型会提供更直观的API.

另一方面,我们的组件会遇到性能/内存问题,我们会应用所有可能的优化和最佳实践.我找不到关于API设计的一个.我试图弄清楚是否最好使用库代码为内置对象构建原型,而不是通过某种命名空间模式将它们组合在专用对象中.

问题是哪种设计更好?并且他们中的一个会获得另一个的性能和/或记忆吗?

Date.prototype.my_custom_function = new function (...) {...};
var period = new Date();
period.my_custom_function();
Run Code Online (Sandbox Code Playgroud)

VS

DateLib.my_custom_function // defined in a DateLib function
var period = new Date();
DateLib.my_custom_function(period);
Run Code Online (Sandbox Code Playgroud)

谢谢,各位,任何帮助表示赞赏!

EDIt:主要的问题是我们的组件最终成为一个笨拙的JS野兽,减慢了一些移动设备,特别是旧的,如iPad1和早期的Androids ......我们已经做了很多优化,但我仍然看到几个有问题部分.我想确定内置的原型污染是否是另一个值得研究的候选者.特别是,这些Date人和大家Object都装满了典型的图书馆代码.例如,实际上它my_custom_function是一个很大的功能,它不是Date代码启动时唯一的原型.该Object更是加载.大多数客户端代码没有使用这些附加功能,它是故意使用的 - 所以我们将决定我们最好坚持使用哪种方式:

  • 继续使用原型污染设计
  • 将可重用API重构为单独的库静态对象

说实话,我还没有运行性能基准测试,一旦我有时间,我会做.如果有人有结果/想法会非常有帮助.

javascript oop performance

10
推荐指数
1
解决办法
420
查看次数

在构造函数内存中嵌套函数效率低下吗?

我一直在看的优秀克罗克福德上的JavaScript视频,到了他认为,使用点new运算符和<some object>.prototype可能会造成混淆,所以他提出的替代方案(如看到这里周围的一点00分40秒大关):

function gizmo(id) {
    return {
        id: id,
        toString: function () {
            return "gizmo " + this.id;
        }
    };
}

function hoozit(id) {
    var that = gizmo(id);
    that.test = function (testid) {
        return testid === this.id;
    };
    return that;
}
Run Code Online (Sandbox Code Playgroud)

人们可以确实认为这看起来更干净,你可以简单地通过调用或分别实例化gizmohoozit.但是,基于我对嵌套函数如何工作的理解,如果我在某个时刻有1000个hoozit实例,那么我将拥有1000个"副本" 和1000个"副本",而不是只添加其中一个如果添加了这些函数分别为Gizmohoozit的原型.gizmo()hoozit()toStringtest

Crockford提供这样一个良好实践的例子似乎很不寻常,所以我想知道这里是否有我遗漏的东西(例如一些隐藏的JS优化),还是仅仅是以性能为代价提高代码质量的情况?

编辑:由于melpomene在评论中指出这些嵌套函数是否是闭包可能很重要,请考虑下面的超级方法示例(相同的视频,几秒钟之后,稍微简化):

function hoozit(id) {
    var that = gizmo(id);
    var super_toString = …
Run Code Online (Sandbox Code Playgroud)

javascript

10
推荐指数
0
解决办法
160
查看次数

如何调整数组大小

是否有一个可以替换以下函数的Array方法(类似的东西a.splice(some, tricky, arguments))?

function resize(arr, newSize, defaultValue) {
  if (newSize > arr.length)
    while(newSize > arr.length)
      arr.push(defaultValue);
  else
    arr.length = newSize;
}
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有更好/更好/更短/实施?如果数组应该增长并且在shrink上删除值,则该函数应附加默认值.

javascript arrays

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

揭示模块/原型模式

到目前为止,我使用Revealing Module Pattern来构建我的Javascript,如下所示:

     var module = (function() {
        var privateVar;

        // @public
        function publicFunction( ) {

        }       

        return {
            publicFunction: publicFunction
        }
    })();
Run Code Online (Sandbox Code Playgroud)

小提琴

虽然这段代码按预期工作,但我最近读到一篇文章,如果你有多个实例,这个模式使用大量内存,并且与其他模式相比,它有一些速度问题.由于我喜欢使用这种模式,我在没有所有这些"问题"的情况下搜索了类似的模式,并且我遇到了Revealing Prototype Pattern.据我所知,JavaScript的Prototype具有更好的内存管理.

现在我想知道使用Revealing Prototype Pattern是否更快/更好的内存?这个基准让我感到惊讶,因为模块模式似乎要快得多.有什么缘故吗?

另外,我无法弄清楚如何使用Revealing Prototype Pattern创建多个实例(与上面的Revealing Module Pattern Fiddle相比):

    var prototypeModule = function( el ) {
        this.init( );
    };

    prototypeModule.prototype = function () {
        var privateVar;

        // @public
        function init( ) {            

        }  

        return {
            init: init
        }
    }();
Run Code Online (Sandbox Code Playgroud)

小提琴2

我究竟做错了什么?

javascript prototype revealing-module-pattern

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

JS类没有经常引用"this"进行成员访问

我典型的JS类结构如下所示:

MyClass = function(args)
{
   this.myProp1 = undefined;
   this.myProp2 = args[0];
   //...more member data 

   this.foo = function()
   {
       return this.myProp1 + this.myProp2; //<- the problem.
   }
   //...more member functions
}

//if MyClass extends a superclass, add the following...
MyClass.prototype = Object.create(MySuperClass.prototype);
MyClass.prototype.constructor = MyClass;
Run Code Online (Sandbox Code Playgroud)

...我对JS的持续烦恼是我似乎必须this在成员函数中不断使用才能访问这些函数所属的同一对象的属性.在this成员函数处理同一类/实例中的成员数据时,可以安全地省略其他几种语言,例如C#和Java .(我意识到JS的结构根本不同,因为它被设计为原型而不是分层继承语言.)

用另一种方式提出问题:有没有办法让未指明的范围不指向window,而是指当前的本地值this

PS我猜这是一种语言限制,但我想我还是要再检查一下.

javascript oop class this

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

构造函数和类有什么区别?

所以我打算建立一个小型图书馆,但这个问题有多种应用。

我想知道使用构造函数和类创建对象之间的区别。例如,这段代码...

function Thing (name) {
    this.name = name;
    this.doSomething = function (){};
    alert("A new thing was created.");
}

var x = new Thing();
Run Code Online (Sandbox Code Playgroud)

...以及这段代码...

class Thing {
    constructor(name) {
        this.name = name;
        alert("A new thing was created.");
    }
    doSomething() {}
}

var x = new Thing();
Run Code Online (Sandbox Code Playgroud)

...产生相同的结果,但以不同的方式。

但是,我更熟悉构造函数,但我需要使用 getter 和 setter 创建对象。尽管MDN将类定义为“语法糖”,但我不知道是否可以使用构造函数定义 getter 和 setter。

还有,女巫的性能是最好的?

注意:我不是指使用Thing.prototype. 我想知道构造函数和类之间的区别。

javascript ecmascript-6

5
推荐指数
0
解决办法
2634
查看次数

在 javascript 中使用原型的主要优点是什么?

function Candy(name) {
 this.name = name;
}
Candy.prototype.printName = function () {
 console.log(this.name);
}
var chocolate = new Candy("chocolate");
chocolate.printName();
var gummyBears = new Candy("gummy bears");
gummyBears.printName();
Run Code Online (Sandbox Code Playgroud)

这与不使用原型完全相同:

function Candy(name) {
  this.name = name;
  this.printName = function () {
    console.log(this.name);
  }
}
var chocolate = new Candy("chocolate");
chocolate.printName();
var gummyBears = new Candy("gummy bears");
gummyBears.printName();
Run Code Online (Sandbox Code Playgroud)

所以我不确定使用原型的优势是什么!

javascript

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