JavaScript的:Class.method与Class.prototype.method

下面的两个声明之间的区别是什么?

Class.method = function () { /* code */ } Class.prototype.method = function () { /* code using this.values */ }

是不是还好想到的第一个语句声明一个静态方法,第二个语句作为一个实例方法的声明?

--------------解决方案-------------

是的,第一个函数与构造函数的对象实例没有关系,你可以认为它像一个“静态方法”。

在JavaScript函数是第一类对象 ,这意味着你可以把他们就像任何对象,在这种情况下,您只添加属性的函数对象

第二个功能,因为你正在扩展的构造函数的原型,它会提供给其创建的所有对象实例new关键字,并且功能(在上下文this关键字)将参考在那里你怎么称呼它实际的对象实例。

考虑下面这个例子:

// constructor function
function MyClass () {
var privateVariable; // private member only available within the constructor fn

this.privilegedMethod = function () { // it can access private members
//..
};
}

// A 'static method', it's just like a normal function
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};

MyClass.prototype.publicMethod = function () {
// the 'this' keyword refers to the object instance
// you can access only 'privileged' and 'public' members
};

var myObj = new MyClass(); // new object instance

myObj.publicMethod();
MyClass.staticMethod();

当你创建一个MyClass多个实例,你仍然只有publicMethod只有一个实例在内存中,但如果privilegedMethod,你最终会创造大量的实例和静态方法与对象实例没有任何关系。

这就是为什么原型节省内存。

此外,如果您更改父对象的属性,是孩子的相应属性尚未改变,它会被更新。

分类:JavaScript的 时间:2012-01-01 人气:1
分享到:

相关文章

  • 修改在JavaScript中的原型,当超级功能 2012-08-23

    有没有像一个功能super ,当你正在修改在JavaScript中的原型? --------------解决方案------------- 不是语言本身 - 但没有理由,当你创建你的类,你不能添加它. 实际上有在途中一个非常好的阐述了CoffeeScript的贾斯汀里迪在他的博客管理原型继承 关键部分转载于此: var __hasProp = Object.prototype.hasOwnProperty; function __extends(child, parent) { for (var

  • 在JavaScript中的原型问题 2012-05-04

    <script type="text/javascript"> var Person = { Create: function(name, age) { this.name = name; this.age = age; }, showMe: function() { return " Person Name: " + this.name + " Age: " + this.age + " "; } }; func

  • 在JavaScript中多重继承/原型 2013-09-18

    我来一个地步,我需要有某种基本的多重继承在JavaScript中发生的事情. 我不是在这里讨论这是否是一个好主意或没有,所以请保持这些意见给自己. 我只是想知道是否有人企图的这与任何(或没有)的成功,以及他们如何去了. 熬下来,我真正需要的是能够有能力从多个原型链继承属性(即每个原型可能有自己合适的链)的对象,但在优先给定的顺序(它会查询的链,以便为第一个定义). 为了演示如何这是理论上的可能,它可以通过二次链附着在主链的末端来实现,但这将影响任何与以前的原型的所有实例,这不是我想要的. 思考?

  • 在JavaScript中混淆原型行为 2014-06-07

    我不明白为什么以下发生: function Class() {} Class.prototype.foo = {a: 1}; Class.prototype.bar = 1; x = new Class(); y = new Class(); y.foo.a = 2; y.bar = 2; x.foo.a; //2 x.bar; //1 当我设置y.foo.a为2,这似乎是在执行相同的操作y.constructor.prototype.foo.a = 2 .为什么会这样,鉴于y.bar = 2不

  • 我应该什么时候在JavaScript中使用“原型” 2015-02-27

    我已经做在JavaScript中/ JQuery的编程相当数量. 但我从来没有使用过"原型". 其实,我不知道这意味着什么. 你有一个实际的例子,当它是有用的? --------------解决方案------------- 最简单的例子: function Foo() { this.bar = function() { return 42; } } 现在,您可以创建多个实例Foo ,只要你想和呼叫bar() var a = new Foo(); var b = new Foo();

  • 保留一提到“本”在JavaScript中的原型功能 2013-01-04

    我刚刚进入使用原型JavaScript和我无法找出如何保持一个this的原型功能范围变化时内部参考的主要对象. 让我来说明我的意思(我使用jQuery在这里): MyClass = function() { this.element = $('#element'); this.myValue = 'something'; // some more code } MyClass.prototype.myfunc = function() { // at this point, "this"

  • 为什么要使用链接在JavaScript中的原型继承? 2013-01-12

    PERF 我们为什么要建立一个原型继承链而不是使用对象组合. 仰望通过原型链中获取的昂贵的每一个步骤. 下面是一些虚拟的示例代码: var lower = { "foo": "bar" }; var upper = { "bar": "foo" }; var chained = Object.create(lower, pd(upper)); var chainedPrototype = Object.create(chain

  • 如何写Number.toFixed在JavaScript中的原型? 2014-11-29

    我需要四舍五入的十进制数来使用JavaScript六个地方,但我需要考虑传统的浏览器,所以我不能靠Number.toFixed 在大收获与toExponential,toFixed和toPrecision是,他们不支持在Mozilla的Firefox之前版本1.5(虽然IE浏览器的支持,因为5.5版的方法),颇具现代结构. 虽然它主要是安全使用这些方法,老的浏览器将打破所以,如果你正在写我们建议你提供自己的原型,这些方法对于较旧的浏览器提供功能性的公共项目. 我使用的是这样考虑 Math.rou

  • 什么是在Javascript中使用原型的优势在哪里? 2012-06-29

    我在Javascript阅读Crockford的私有成员http://javascript.crockford.com/private.html页,有一个问题这可能有点关系. 为什么开发者应该使用原型? 例如, 例如,我可以这样做 var Foo = new Object(); Foo.bar = function() { alert('Its a bar'); }; var x = Foo; x.bar(); 代替 var Foo = function(){}; Foo.prototype.b

  • 在JavaScript中创建原型链(ES-5) 2012-11-08

    我试图创建一个原型链创建了一个对象,这样的功能: something = object(proto1, proto2, proto3); // Lookup order is something -> proto1 -> proto2 -> proto3 -> Object.prototype 我倒是来包装给定的原型重写自己的查询链(这样它们可以重复使用),并希望以最小的复制/内包装属性这么做. 有没有在Javascript /的ECMAScript 5的任何功能,可以用来替代所有

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.113 (s). 10 q(s)