Свойство прототипа создается при объявлении функции.
Например:
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, если объект является экземпляром класса.
Да, есть:
class Point(val x: Int, val y: Int)
с использованием val
, но тогда параметр становится окончательным (постоянным). Если вы хотите переназначить значение, вы должны использовать var
. Итак,
class Point(var x: Int, var y: Int)
x
иy
private, вам нужно добавитьprivate
перед каждымval
в списке аргументов конструктора. – Leif Wickland 25 March 2012 в 22:38private val
в списке аргументов? Вы можете просто оставить его, и компилятор сделает его полем при необходимости. – Luigi Plinge 26 March 2012 в 06:39private[this] val
. Это приводит к вопросу, упомянутому в вопросе. – Nicolas 26 March 2012 в 06:54