Использование «точки» внутри имени прототипа в JavaScript - PullRequest
3 голосов
/ 01 марта 2012

Допустим, у меня есть этот класс:

function classA(n){
    this.name = n
}

classA.prototype.getName = function(){
    return this.name
}

var x = new classA('john')
console.log(x.getName())

Мой вопрос: могу ли я сгруппировать несколько методов в пространстве имен? Поэтому я хотел бы сделать это:

var x = new classA('john')
console.log(x.CONSTANT.getName())

Поэтому я хотел бы назвать некоторые методы как x.someMethod (), а другие как x.CONSTANT.otherMethod ()

PS: я ищу кросс-браузерный метод. Bind не работает в Safari и IE9.

Ответы [ 4 ]

3 голосов
/ 01 марта 2012

Вы можете сделать это, например, через bind. Google es5 shim для реализации bind в браузерах, которые не поддерживают его изначально.

function MyClass(name) {
   this.name = name;
   this.CONSTANT.otherMethod = this.CONSTANT.otherMethod.bind(this);
}
MyClass.prototype.CONSTANT = {
   otherMethod: function() {
        alert(this.name);
   }
};
1 голос
/ 01 марта 2012

Насколько я знаю, константа - это просто свойство, и оно не может содержать методы, вам нужно разделить ваши объекты и использовать методы, чтобы иметь тот же эффект:

function A (id) {

    this.id = id;
    this.showId = function () { return this.id; }
};

function B (a) {

    this.a = a;
    this.getA = function () { return this.a; }
}

var a = new A(12);
var b = new B(a);

b.getA().showId();

edit: Вы можете использовать литеральный объект следующим образом

function B (id) {

  this.id = id;
  this.CONSTANT = { otherMethod: function () { alert("..."); } };
  someMethod = function () { return this.id; }
}

, но литеральный объект CONSTANT не может получить доступ к методам B-объекта,

Рассмотрим сообщение @kirilloid для округления этого.

0 голосов
/ 01 марта 2012

Вы можете использовать геттеры / сеттеры (см. эту статью ) для достижения этой цели. Например, вы можете определить это так:

classA.prototype.__defineGetter__('CONSTANT', function() {
    var that = this;
    return {
        getName: function() {
            return that.name;
        }
    };
});

Примечание that содержит ссылку на объект. Теперь будет работать

x = new classA('test');
x.CONSTANT.getName();
// result - test
0 голосов
/ 01 марта 2012

Вы можете, но вы должны быть осторожны, потому что это не будет действовать так, как вы думаете.this для метода будет пространством имен, а не корневым объектом.Например, в x.CONSTANT.getName() объект this будет x.CONSTANT, а не x.

Вот пример кода, который делает то, что вы просите (или в jsfiddle ):

function MyClass() {}

MyClass.prototype.CONSTANT = {
    getName: function() {
        alert('Foo');
    }
};


var c = new MyClass();
c.CONSTANT.getName();

Чтобы убедиться в правильности this, вам нужно сделать гораздо больше.

...