使用“原型”作为变量

时间:2011-07-25 21:54:51

标签: javascript

大多数时候(主要是教程),我看过用于方法的“原型”。

我很确定它也可以用于变量(可能对设置“默认值”最有用)。有没有理由不经常用于功能?这是不好的做法,还是有显着的性能差异?

3 个答案:

答案 0 :(得分:2)

在我的头顶,你失去了hasOwnProperty()的功能,如果你在对象上进行for ... in循环,这将非常有用。考虑这两个对象:

function MyObject() { ... }
MyObject.prototype.someProperty = 1;

var a = new MyObject();
var b = new MyObject();
b.someProperty = 2;

a.hasOwnProperty("someProperty"); // false
b.hasOwnProperty("someProperty"); // true

根据您的情况,这可能或不重要。

编辑:想到另一个人。如果在原型中存储对象,并且该对象的实例更改了该对象的属性,则会影响所有其他实例:

http://jsfiddle.net/BbmgP/

function MyObject() { ... }
MyObject.prototype.someProperty = { value: 1 };

var a = new MyObject();
var b = new MyObject();

b.someProperty.value = 2;
a.someProperty.value; //  2!! not 1

答案 1 :(得分:1)

反过来考虑一下:为什么要在对象的原型中存储对象的属性?

有两个答案:

  1. 节省内存。在每个实例上定义方法会消耗很多,因为从技术上讲,每个实例都有自己的方法。简单数据类型的成本要低得多。
  2. 共享访问权限。实例可能需要共享对公共属性的访问权限。但是,对于简单数据类型,这是不可能的,因为它们不是通过引用存储的。
  3. gilly3 mentioned,如果您不完全确定自己在做什么,可能会偶然发生。 (哦,是的,它发生在我身上......)

    最佳实践:

    • 方法转到原型
    • 属性转到实例,除非您需要共享访问权限(并且属性是对象类型的)

    [编辑]

    • 应使用闭包实现共享访问,而不是“类变量”

    [/编辑]

    是的,使用原型的性能是slightly worse而不是其他方式。但是你永远不应该尝试优化这样的东西,因为性能增益几乎不可察觉,但代码的可读性和可维护性可能会受到很大影响。

答案 2 :(得分:-1)

从JavaScript 1.1开始引入的JavaScript原型对象是一个预构建的对象,它简化了向对象的所有实例添加自定义属性/方法的过程

您可以添加默认属性,这是一个示例:

function myObject()
{
    this.constructor();
}

myObject.prototype = 
{

    constructor : function ()
    {
        this.MyProperty1 = "123456"; //default property
        this.MyProperty2 = "bla";    //default property
    }    
};

如果这有帮助,请告诉我......