2016-12-08 3 views
0

Я пытаюсь получить доступ к this в prototype constructor (я думаю, что это то, что он называется?).Доступ к этому объекту конструктора

SomethingUseful.prototype = { 
    constructor: SomethingUseful, 
    init: init, 
    someFunction: someFunction, 
    mouseDownHandler: mouseDownHander.bind(this) 
} 

Но this равно window. Поэтому я пробовал делать bind(SomethingUseful), а когда я this в mouseDownHandler, вся функция выйдет в виде обычного текста, поэтому я не могу использовать вещи, которые находятся в this, в действительной функции mouseDownHandler.

Что такое правильный способ доступа this из SomethingUseful в constructor функции (опять же, я, вероятно, получил имя неправильно, и если бы я сделал, пожалуйста, исправить ее, или дайте мне знать в комментариях)?

+1

Что именно вы пытаетесь достичь? См. Подробное объяснение 'this'. http://stackoverflow.com/questions/40722379/callback-with-this-confusion/40722549 –

+0

@ScottMarcus Вместо этого: 'this.mouseDownHandler = mouseDownHander.bind (this);' Я хочу добавить его в 'SomethingUseful .prototype = {'. Надеюсь, это прояснит это. – Jessica

+1

[Определение вашего прототипа странно] (http://stackoverflow.com/q/17474390/1048572). И нет, вы не можете привязать метод к экземпляру на прототипе, поскольку во время определения нет экземпляра ('this'), и метод используется совместно. Сделайте это в конструкторе! – Bergi

ответ

1

Вместо этого: this.mouseDownHandler = mouseDownHander.bind(this); Я хочу добавить его в SomethingUseful.prototype = {.

Это невозможно. На данный момент вы пытаетесь связать функцию с экземпляром, нет экземпляра, к которому вы можете привязать функцию. Только во время или после вызова конструктора будет существовать экземпляр для привязки функции.

Другими словами: Вы пытаетесь съесть пиццу перед ее доставкой.


Связанный: How to access the correct `this` context inside a callback?

+0

На самом деле, это больше похоже на попытку съесть пиццу перед ее приготовлением. –

+0

Вызывается ли конструктор при создании нового экземпляра 'somethingUseful'? – Jessica

+0

'SomethingUseful' * is * конструктор (я предполагаю, что у вас есть что-то вроде' function SomethingUseful() {...} '). –

1

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

Обычно для свойств, хранящих функции (аналогичные методы), эта функциональность не изменяется от экземпляра к экземпляру, поэтому эти свойства обычно производятся на прототипе объекта, так что каждый экземпляр не должен хранить точный такая же функциональность, как и каждый другой экземпляр.

При проектировании объекта, чтобы иметь экземпляры, созданные позже, мы объявляем функцию, а не литерал объекта, потому что вы не можете вызвать объект.

// This is known as a "constructor function" because it is 
 
// intended to produce (construct) objects that will then 
 
// be bound to instance variables: 
 
function SomethingUseful(){ 
 
    // This is a regular variable that is scoped to the function 
 
    // it will not be accessible to instances later. 
 
    var a = 10; 
 
    
 
    // Because of the word "this", this becomes an "instance property" 
 
    // that each instance of SomethingUseful will have. Each instance 
 
    // will start out with a default value of 20, but each instance 
 
    // can change that value and it won't affect any other instance 
 
    this.someProperty = 20; 
 
} 
 

 
// Methods are not set up in the constructor (so they do not become 
 
// instance properties) instead, they are set up on the constructor's 
 
// prototype and inherited into each instance. All instances share 
 
// the same one prototype: 
 
SomethingUseful.prototype.someMethod = function(){ 
 
    // Even though this method is not stored with each instance, it 
 
    // can access the current instance by using "this" 
 
    return this.someProperty; 
 
}; 
 

 

 
// Make instances of SomethingUseful by calling the constructor function 
 
// which returns object instances. Those instances are stored in different 
 
// variables and that's how we keep the instances separate from each other 
 
var obj1 = new SomethingUseful(); 
 
var obj2 = new SomethingUseful(); 
 

 
// Now that we have used the constructor function to create the instances, 
 
// we can ask those instances what function was used to create them: 
 
console.log("The object stored in obj1 was constructed with: " + obj1.constructor.name); 
 

 
//Check obj1: 
 
console.log("obj1.someProperty is: " + obj1.someProperty); 
 
obj1.someProperty = 50; 
 
console.log("obj1.someProperty changed and is now: " + obj1.someProperty) 
 
console.log("obj1.someMethod returns: " + obj1.someMethod()); 
 

 
//Check obj2: 
 
console.log("obj2.someProperty is: " + obj2.someProperty); 
 
console.log("obj2.someMethod returns: " + obj2.someMethod());

Вы пытаетесь заботиться о чем-то, что JavaScript заботится о вас. Просто определите функциональность, которая вам нужна в свойстве события, а затем выполните действия и сделайте экземпляры вашего объекта. JavaScript гарантирует, что каждый экземпляр получит вашу функцию.

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