2015-01-18 4 views
2

В объектно-ориентированных языках на основе классов одним из преимуществ объектов является инкапсуляция: каждый метод объекта имеет доступ к данным объекта.Методы объектов против функций и инкапсуляции в JavaScript

В JavaScript это преимущество инкапсуляции не похоже на то, что связано с функцией this.

В нижеприведенном примере method1 есть доступ к this без дополнительного переплета, но method2 нет.

Есть ли какая-либо причина использовать метод объекта вместо обычной функции в приведенном ниже примере, если нам нужно bind как method2 и function2 для того, чтобы иметь доступ к this.args внутри них?

// service declaration 

function Service(args) { 
    this.args = args; 
} 

Service.prototype.method1 = function(query) { 
    ............ 
    let res1 = service2.get(query).map(this.method2.bind(this)); // option 1 
    let res2 = service2.get(query).map(function2.bind(this)); // option 2 
    ............ 
}; 

Service.prototype.method2 = function(data) { 
    // use args from 'this' 
} 

function function2(data) { 
    // use args from 'this' 
} 

// service use 

let service = new Service(args); 
service.method1(req.query). 
+1

что _document (данные) _? Что такое _service2_? У вас есть менее надуманный пример? Я не понимаю, что вы пытаетесь сделать. – Mathletics

+0

Я согласен с комментарием выше - что такое 'document (data)'? – unobf

+0

Очевидным преимуществом было бы вызывать 'service.method2()' вместо 'function2.call (service)', когда нет необходимости связываться (где нет большой разницы) – Bergi

ответ

1

Я думаю, что вы всегда должны использовать методы вместо использования bind(this) потому что при использовании внешних функций, вы должны нести те, наряду с этим классом. Почему бы просто не включить их как метод в класс?

Кроме того, я не получаю сообщение о вызове this.method2.bind(this). this.method2 уже связан с this потому что это свойство this.

Предполагая, что вы знаете, некоторые ES6 из вашего let заявления, вы могли бы написать такой код:

class Service { 
 
    constructor(args) { 
 
    this.args = args; 
 
    } 
 
    method1(query) { 
 
    let res1 = Service2.get(query).map(this.method2); //btw, what is Service2 here? Is it just an object with methods or does it need to be initialized? 
 
    } 
 
    method2(data) { 
 
    //use data 
 
    } 
 
} 
 
let service = new Service(args); 
 
service.method1(req.query);

+0

Если я использую 'let res1 = Service2.get (query) .map (this.method2)' без 'bind' на' method2', определенный через прототип, 'this' заканчивается' undefined' в 'method2' Is Поведение ES6 'class' отличается? (Я сейчас проверю) – krl

+0

Я на классах io.js и V8 и ES6 еще не реализован. Таким образом, нижняя строка заключается в том, что с помощью метода method2 определяют через прототип, мне нужно 'bind' для доступа к правильному' this' – krl

+1

@kyrylkov. Вы можете использовать 6to5 для пересылки классов в чистый ES5. И все методы класса в ES6 имеют 'this' связан правильно - я только что проверил с этим фиктивным кодом:' class Service { constructor (args) { это.args = args; } метод1 (запрос) { let res1 = [1, 2, 3] .map (this.method2); // btw, что такое Service2 здесь? Это просто объект с методами или его нужно инициализировать? return res1; } способ2 (данные) { данные возврата * 2; } } let service = новый сервис ({ arg: 1 }); service.method1 ("data"); ' – rioc0719

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