Я читал о цепочках контекста и прототипах, и хотя я довольно много узнал, я все еще смущен следующими примерами кода. Первый пример, который был снят с http://www.jibbering.com/faq/notes/closures/, работает как ожидалось; однако, моя попытка переписать его в другой форме не работает, как ожидалось.
//Example 1: Code from the link - This Works As Expected
function objOne(param){
this.PropertyOne = param;
}
function objTwo(param){
this.PropertyTwo = param;
}
objTwo.prototype = new objOne("propertyOne");
var obj = new objTwo("propertyTwo");
alert(obj.PropertyOne); //result: propertyOne
alert(obj.PropertyTwo); //result: propertyTwo
//**********************************************************
//Example 2: My Attempt to Write it differently - Fails
//Problem: I thought the scope chain would work the same way for property three
var objThree = new Object();
objThree.PropertyThree = "propertyThree";
var objFour = new Object();
objFour.PropertyFour = "propertyFour";
objFour.prototype = objThree;
alert(objFour.PropertyThree); //result: undefined - I thought the scope chain would work the same here.
alert(objFour.prototype.PropertyThree); //result: propertyThree;
alert(objFour.PropertyFour); //result: propertyFour
Так что это «неопределенное» для objFour.PropertyThree, которое озадачивает меня. Я хотел бы знать, ПОЧЕМУ это работает так.
РЕДАКТИРОВАНИЕ ДОБАВИТЬ: Если вы хотите увидеть интересную иллюстрацию проблемы, рассмотрите следующий код. Я собрал это вместе, работая над примерами и читая статьи на эту тему.
//**** Function Object vs. Instance Object
function Foo(){
this.something = "meh";
}
function ObjectsAndFunctions(){
//this is Foo as a function object and as such function properties are available.
alert(Foo.name); //result: Foo
alert(Foo.length); //result: 0
alert(Foo.something); //result: undefined
//this is Foo as an instance object so function properties are not available
var test = new Foo();
alert(test.name); //result: undefined
alert(test.length); //result: undefined
alert(test.something); //result: "meh"
}
Когда Foo представлен как объект функции, у вас есть доступные свойства функции (имя, длина), но свойства экземпляра недоступны. Когда Foo выставляется как объект экземпляра, свойства функции исчезают, а свойство объекта (что-то) становится доступным.
Я сомневаюсь, что все это выражается совершенно правильно; однако, это действительно хорошо иллюстрирует проблему (то есть мое непонимание в первоначальном примере).