2016-05-23 2 views
-1

Привета В приведенном ниже примере я импортировать MeasurementObject с помощью: import MeasurementObject from './app/..etc'это ключевое слово для объекта буквального

Когда слово экземпляра MeasurementObject.getScrollToValue()

this внутри метода MeasurementObject.getScrollToValue() относится к исполняющему контексту , В результате this.getURL() не определено. Как я могу заставить его ссылаться на текущий контекст объекта MeasurementObject и, следовательно, называть this.getURL().

const MeasurementObject = { 

    getType(){ 
     return "a" 
    } 

    getURL(){ 
     return "b"; 
    } 

    getScrollToValue(){ 
     return this.getURL(); 
    } 
} 

export default MeasurementObject; 
+1

Вы спрашиваете разницу между литералом объекта javascript и функцией или классом? –

+3

Вы отредактировали свой вопрос на совершенно другой вопрос. Спасибо, что потратили время. – naomik

+1

Вы, кажется, полностью изменили свой вопрос. Когда вы вызываете функцию с помощью 'MeasurementObject.getScrollToValue()', 'this' внутри метода будет ссылаться на' MeasurementObject', так что у вас все работает нормально. Не уверен, что вы имеете в виду с * «' this' внутри метода ... ссылается на исполняемый контекст »*. –

ответ

1

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

Теперь, что касается вашего примера, «это» внутри вашей функции, ссылаясь на объект правильно, однако вы его не возвращаете.

const MeasurementObject = { 

    getType(){ 
     return "a" 
    }, 

    getURL(){ 
     return "b"; 
    }, 

    getScrollToValue(){ 
     return this.getURL(); 
    } 
} 


var a = MeasurementObject.getScrollToValue() 
console.log(a) 

Когда вы определяете такой объект, который уже работает над экземпляром, а свойства задаются на объекте, а не на его прототипе.

обновление

Когда вы сделаете это:

class MeasurementClass { 

    getType(){ 
     return "a" 
    }, 

    getURL(){ 
     return "b"; 
    }, 

    getScrollToValue(){ 
     return this.getURL(); 
    } 
} 

что вы получите что-то вроде:

function MeasurementClass(){} 
MeasurementClass.prototype.getType = function(){ return "a" } 
MeasurementClass.prototype.getURL = function(){ return "b"; } 
MeasurementClass.prototype.getScrollToValue = function(){ return  this.getURL(); } 

И тогда, когда вы пытаетесь к нему доступ без инстанцировании MeasurementClass.getScrollToValue

Yo u пытаются получить доступ к тем, что не существует.

Однако при создании экземпляра функции всех этих свойств прототипа унаследованы к примеру так:

const measurementClass = new MeasurementClass(); 

measurementClass будет экземпляром MeasurementClass и наследует все его прототип.

Надеюсь, что поможет немного.

+0

Вы, кажется, путаете 'class' с' const'. Нет, объектные литералы не создают классы с объектами прототипа. – Bergi

+0

Объект Bergi litteral - вы пришли сюда, чтобы опоздать, его первоначальный вопрос был связан с классом, но, спасибо за вашу причину, вы можете освободить его. –

+0

А, я не видел этого ужасного изменения вопроса. Тем не менее, ваш ответ ошибся, спасибо за редактирование :-) – Bergi

2

Тот факт, что вы экспортируете их, не имеет значения.

MeasurementClass является функцией конструктора с 3 методами, определенными на MeasurementClass.prototype. getType, getURL и getScrollToValue

Для того, чтобы использовать класс, вы должны создать экземпляр класса, используя ключевое слово new. (new MeasurementClass()).methodName(...)

против

MeasurementObject является литерал объекта с 3 методов, определенных непосредственно на объекте. getType, getURL и getScrollToValue

Использование объекта является лишь вопросом вызова obj.methodName()

+0

в сторону: вам не нужны эти дополнительные обертывающие парсеры использовать конструкторские результаты, 'new MeasurementClass(). methodName()' работает одинаково. – dandavis

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