JavaScript: Как переопределить метод для всех экземпляров некоторого класса? - PullRequest
1 голос
/ 06 октября 2011
function Person(){
    this.scream = function(){
        alert('NO NO NO!!!!');
    };
}

var steve = new Person();
steve.scream() // NO NO NO!!!!
Person.prototype.scream = function(){
    alert('YES YES YES!!!!');
}
steve.scream() // still NO NO NO!!!!

Есть ли способ переопределить ' scream ' без явной ссылки на Стива?Подумайте о случаях, когда у вас могут быть случаи Человек .

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Нет,

Имея это объявление Person, каждый раз, когда вы создаете его новый "экземпляр", запускается "конструктор", и вы создаете совершенно новую функцию scream (замыкание), на которую у вас нет ссылок. до, кроме только что созданного объекта, steve.scream, то есть.

В качестве альтернативы вы можете сделать это так:

function Person(){}

Person.prototype.scream = function(){
    alert('NO NO NO!!!!');
}

var steve = new Person();
steve.scream() // NO NO NO!!!!
Person.prototype.scream = function(){
    alert('YES YES YES!!!!');
}
steve.scream() // this time is YES YES YES!!!!

В этом случае начальный scream «метод» доступен только в одном месте на прототипе, и вы можете перезаписать его для всех «экземпляров».

1 голос
/ 06 октября 2011
function Person(){};
Person.prototype.scream = function(){ alert('NO NO NO!!!!'); };
var steve = new Person();
steve.scream();
Person.prototype.scream = function(){alert('YES YES YES!!!!');};
steve.scream();
0 голосов
/ 06 октября 2011

и, если вы хотите продолжать использовать свой стиль кода, вам может понравиться

function Person(){
    this.constructor.prototype.scream = function(){
        alert('NO NO NO!!!!');
    };
}
var steve = new Person();
steve.scream();
Person.prototype.scream = function(){ alert('YES YES YES!!!!'); };
steve.scream();
...