JavaScript Цепочки и прототипы - PullRequest
2 голосов
/ 24 января 2020

Я читал о цепочках контекста и прототипах, и хотя я довольно много узнал, я все еще смущен следующими примерами кода. Первый пример, который был снят с 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 выставляется как объект экземпляра, свойства функции исчезают, а свойство объекта (что-то) становится доступным.

Я сомневаюсь, что все это выражается совершенно правильно; однако, это действительно хорошо иллюстрирует проблему (то есть мое непонимание в первоначальном примере).

...