Доступ к параметрам класса из сопутствующего объекта в Scala [duplicate]

Свойство прототипа создается при объявлении функции.

Например:

 function Person(dob){
    this.dob = dob
 }; 

Свойство Person.prototype создается внутренне после объявления над функцией. Многие свойства могут быть добавлены в Person.prototype, которые совместно используются экземплярами Person, созданные с использованием нового Person ().

// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob}; 

Стоит отметить, что Person.prototype является Object литералом по умолчанию ( он может быть изменен по мере необходимости).

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

var person1 = new Person(somedate);
var person2 = new Person(somedate);

создает 2 экземпляра Person, эти 2 объекта могут вызывать возрастное свойство Person.prototype как person1.age, person2.age.

На приведенном выше рисунке вы можете видеть что Foo является объектом Function и поэтому имеет ссылку __proto__ на Function.prototype, который, в свою очередь, является экземпляром Object и имеет ссылку __proto__ для Object.prototype. Протольная ссылка заканчивается здесь с __proto__ в Object.prototype, указывающем на null.

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

__proto__ не является стандартным способом доступа к цепочке прототипов, стандартным, но аналогичным подходом является использование Object.getPrototypeOf (obj).

Ниже код для instanceof дает лучшее понимание:

object instanceof Оператор класса возвращает true, когда объект является экземпляром класса, более конкретно, если Class.prototype находится в прото-цепочке этого объекта то объект является экземпляром этого класса.

function instanceOf(Func){
var obj = this;
while(obj !== null){
    if(Object.getPrototypeOf(obj) === Func.prototype)
        return true;
    obj = Object.getPrototypeOf(obj);
}
return false;
}

Вышеуказанный метод может быть вызван как: instanceOf.call(object,Class), которые возвращают true, если объект является экземпляром класса.

34
задан Leif Wickland 25 March 2012 в 23:07
поделиться

2 ответа

Да, есть:

class Point(val x: Int, val y: Int)
60
ответ дан Nicolas 22 August 2018 в 00:04
поделиться
  • 1
    Я чувствую себя неловко. Я должен сделать свою домашнюю работу лучше, как я могу пропустить это: P – user1285925 25 March 2012 в 22:17
  • 2
    @ user1285925 Если вы хотите сохранить x и y private, вам нужно добавить private перед каждым val в списке аргументов конструктора. – Leif Wickland 25 March 2012 в 22:38
  • 3
    @LeifWickland Есть ли причина когда-либо объявлять private val в списке аргументов? Вы можете просто оставить его, и компилятор сделает его полем при необходимости. – Luigi Plinge 26 March 2012 в 06:39
  • 4
    @LuigiPlinge По умолчанию компилятор сделал private[this] val. Это приводит к вопросу, упомянутому в вопросе. – Nicolas 26 March 2012 в 06:54
  • 5
    оно прекрасно. – hangtwenty 11 August 2013 в 01:55

с использованием val, но тогда параметр становится окончательным (постоянным). Если вы хотите переназначить значение, вы должны использовать var. Итак,

class Point(var x: Int, var y: Int)
4
ответ дан yerlilbilgin 22 August 2018 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: