javascript - Javascript 中的原型(prototype)有什么作用?

标签 javascript oop object inheritance prototype

我已经浏览了大量的在线文档,但我发现我需要从 Prototypes 获得的内容比我目前获得的更多。

谁能给我简单介绍一下原型(prototype)的工作原理吗?当我说“基本介绍”时,我指的是初级程序员可以理解的简单解释!

最佳答案

JavaScript 中的 OOP,无需原型(prototype)继承

考虑以下keyValueStore对象:

var keyValueStore = (function() {
    var count = 0;
    var kvs = function() {
        count++;
        this.data = {};
        this.get = function(key) { return this.data[key]; };
        this.set = function(key, value) { this.data[key] = value; };
        this.delete = function(key) { delete this.data[key]; };
        this.getLength = function() {
            var l = 0;
            for (p in this.data) l++;
            return l;
        }
    };
    
    return  { // Singleton public properties
        'create' : function() { return new kvs(); },
        'count' : function() { return count; }
    };
})();

我可以通过这样做创建该对象的新实例:

kvs = keyValueStore.create();

该对象的每个实例都将具有以下公共(public)属性:

  • 数据
  • 获取
  • 设置
  • 删除
  • 获取长度

现在,假设我们创建此 keyValueStore 对象的 100 个实例。尽管 getsetdeletegetLength 会对这 100 个实例中的每一个执行完全相同的操作,每个实例都有自己的该函数的副本。

<小时/>

具有原型(prototype)继承的 JavaScript 中的 OOP

现在,想象一下如果您只有一个 getsetdeletegetLength 副本,每个实例都会引用相同的函数。这会提高性能并且需要更少的内存。

这就是原型(prototype)的用武之地。原型(prototype)是继承但不被实例复制的属性的“蓝图”。因此,这意味着它对于对象的所有实例仅在内存中存在一次,并且由所有这些实例共享。

现在,再次考虑 keyValueStore 对象。我可以这样重写:

var keyValueStore = (function() {
    var count = 0;
    var kvs = function() {
        count++;
        this.data = {};
    };

    kvs.prototype = {
        'get' : function(key) { return this.data[key]; },
        'set' : function(key, value) { this.data[key] = value; },
        'delete' : function(key) { delete this.data[key]; },
        'getLength' : function() {
            var l = 0;
            for (p in this.data) l++;
            return l;
        }
    };

    return  {
        'create' : function() { return new kvs(); },
        'count' : function() { return count; }
    };
})();

这与之前版本的 keyValueStore 对象完全相同,只是它的所有方法现在都放在原型(prototype)中。这意味着所有 100 个实例现在共享这四个方法,而不是每个实例都有自己的副本。

<小时/>

资源

有关此事的基本介绍,请参见例如。 inheritance and the prototype chainMDN website .

要更深入地了解原型(prototype)继承,请参阅例如。 Aadit M Shah的文章 Why Prototypal Inheritance MattersKyle Simpson的在线图书You Don't Know JS: this & Object Prototypes .

关于javascript - Javascript 中的原型(prototype)有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36092020/

相关文章:

javascript - 给隐藏的div效果出现

c# - 在鼠标移出时关闭 AJAX 控制工具包 BallonPopupExtender

c++ - 关于类互动的问题

oop - 静态类是正确的方法吗?

javascript - 当创建一个新对象时,为什么它会更新旧对象?

javascript - 为什么对象的键只是第一个字符?

javascript - 将数字添加到父窗口中的变量

Java判断一个对象是哪个类

php - 在 php 中使用私有(private)构造函数扩展类与版本 5.1 到 5.4 不同

javascript - 碰撞追踪