簡體   English   中英

使用原型的Class.create定義私有/受保護的屬性和方法

[英]Using Prototype's Class.create to define private/protected properties and methods

有一種可以定義在Javascript protected和private的屬性和方法,有良好的通用方法, 這里的網站上 但是,當前版本的Prototype(1.6.0)沒有內置的方法可以通過其Class.create()語法進行定義。

我很好奇開發人員在使用原型時要定義私有和受保護的屬性和方法的最佳實踐是什么。 有沒有比普通方法更好的方法?

有一個討論, 這里將試制的燈塔,顯示這可以解釋為什么你不能與原型的Class.create這種效果。

您可以做的是在構造函數(初始化)中使用局部變量作為原型,然后創建一個閉包,以將該變量訪問/公開給您的公共方法。

這是一個代碼示例:

// properties are directly passed to `create` method
var Person = Class.create({
   initialize: function(name) {
      // Protected variables
      var _myProtectedMember = 'just a test';

      this.getProtectedMember = function() {
         return _myProtectedMember;
      }

      this.name = name;
   },
   say: function(message) {
      return this.name + ': ' + message + this.getProtectedMember();
   }
});

這是關於這個問題的道格拉斯·克羅克福德理論。

http://www.crockford.com/javascript/private.html

關鍵是將公共方法添加為閉包,如下例所示:

 Bird = Class.create (Abstract,(function () {
    var string = "...and I have wings"; //private instance member
    var secret = function () {
        return string;
    } //private instance method
    return {
        initialize: function (name) {
            this.name = name;
        }, //constructor method
        say: function (message) {
            return this.name + " says: " + message + secret();
        } //public method
    }
})());

Owl = Class.create (Bird, {
    say: function ($super, message) {
        return $super(message) + "...tweet";
    } //public method
})

var bird = new Bird("Robin"); //instantiate
console.log(bird.say("tweet")); //public method call

var owl = new Owl("Barnie"); //instantiate
console.log(owl.say("hoot")); //public method call inherit & add

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM