2017-01-24 4 views
0

Я пытаюсь использовать наследование объектов javascript, где я переопределяю «частный» метод в базовом «классе» (другими словами, сделайте его защищенным методом).Как переопределить частный метод в javascript?

Возможно ли это? Вот моя лучшая попытка (которая не работает)

function Vehicle(color) { 
    this.color = color; 
} 

Vehicle.prototype.drive = function() { 
    _getMessage.call(this); 
} 

function _getMessage() { 
    console.log("override this method!") 
} 


//---------------------------------------------------------------- 

var Car = (function() { 

    Car.prototype = Object.create(Vehicle.prototype); 
    Car.prototype.constructor = Car; 

    function Car(color) { 
     Vehicle.call(this, color) 
    } 

    function _getMessage() { 
     console.log("The " + this.color + " car is moving!") 
    } 


    return Car; 
}()); 

//---------------------------------------------------------------- 

$(function() { 
    var c = new Car('blue'); 
    c.drive() 

}) 

https://plnkr.co/edit/ZMB9izK1W9VuFQHPNsvu?p=preview

+1

Вы можете Таким образом. Кроме того, оригинальная функция '_getMessage' на самом деле не является частью вашего класса. – Jorg

+1

'Вот моя лучшая попытка (которая не работает)' - что с этим не так? Что вы ожидаете? Что вы получаете вместо этого? –

+0

* _getMessage * является глобальным, он не является «частным» каким-либо образом, просто замените его. Если он действительно был закрытым, вы можете его заменить, если у вас есть привилегированная функция специально для этого. – RobG

ответ

0

Вы могли бы ввести привилегированный метод, который может изменить частное одно:

// IIFE to create constructor 
 
var Car = (function(){ 
 

 
    // Private method 
 
    function _getMessage(text){ 
 
    console.log('original: ' + text); 
 
    } 
 

 
    // Normal constructor stuff 
 
    function Car(make){ 
 
    this.make = make; 
 
    } 
 
    Car.prototype.getMake = function(){ 
 
    return this.make; 
 
    } 
 
    Car.prototype.getMessage = function(){ 
 
    _getMessage(this.make); 
 
    } 
 

 
    // Privileged function to access & change private method 
 
    Car.changeGetMessage = function(fn) { 
 
    _getMessage = fn; 
 
    } 
 
    return Car; 
 
}()); 
 

 
// Demonstration 
 
// Create instance 
 
var ford = new Car('Ford'); 
 
console.log(ford.getMake()); 
 

 
// Call original method 
 
ford.getMessage(); 
 

 
// Replace original 
 
Car.changeGetMessage(function(text){ 
 
    console.log('new message: ' + text); 
 
}); 
 

 
// Existing instances get new method 
 
ford.getMessage(); 
 

 
// Create new instance 
 
var volvo = new Car('Volvo'); 
 
console.log(volvo.getMake()); 
 

 
// New instances get method too 
 
volvo.getMessage();

 Смежные вопросы

  • Нет связанных вопросов^_^