Давайте начнем с основ.
Не трогай __proto__
. Это ящик Пандоры. Вы не хотите возиться с этим. Мало того, что он не поддерживается кросс-браузер, но вы можете написать отвратительный код, и нет необходимости использовать его.
var Constructor = new Function;
Constructor.fn = Constructor.prototype;
Constructor.fn.someFunc = function() {
alert("someFunc");
}
var obj = new Constructor;
var namespace = {};
namespace.someStaticFunc = function() {
alert("someStaticFunc");
}
Вам нужно различать пространство имен и конструктор. Есть ли реальная причина, по которой методы пространства имен должны записываться в прототип, а не в качестве свойств объекта?
Так что для ответа один да, вы можете пропустить прототип.
Что касается второго вопроса, так как изначально вы пишете прототипу то, что вы делаете, то редактируете методы непосредственно для объекта.
Рассмотрим .prototype
как определение Class
. Если вы редактировали obj.__proto__
, вы редактировали Class
из Object
во время выполнения. Вы испортили все другие объекты, полученные из этого Class
. Динамические классы в порядке. Но редактирование классов внутри объектов - это действительно хороший способ создания скрытых ошибок.
Вопрос 2: странно.
Вот что происходит:
var o = {}; // Ok o is an object
var o.__proto__.property = 5; // Ok I changed o's class and it now has a property = 5.
var o.__proto__.construct = function() { }; // Ok I changed the class again it now has a constructor
var p = new o.construct(); // we create an object from my constructor.
(p.__proto__ === o.construct.prototype) // true! the proto object is o.c.prototype. Because
// p is created from o.c so the prototype is that of o.c
(o.construct.__proto__ === Object.prototype) // true! Oh-uh. Now look what we've been doing!
// When you created `var o = {}` and edited o.__proto__ you've been editing Object.prototype
Ты уже видела колокола тревоги? Вы редактировали класс Object на лету. Весь ваш код вокруг вас разваливается.
Функция - это объект, верно?
Function.property === 5 // oh dear!
Мы нашли всю причину. Мы писали эти методы в Object.prototype. Таким образом, EVERY объект имеет этот метод, определенный на нем. Включая .__proto__
, потому что это тоже объект.
Видел ли я, что иметь дело с .__proto__
было плохой идеей? Я думаю, что я должен сказать это снова.
В случае, если ваше удивление this
было instance
, this.__proto__
было Object.prototype.SomeObject.prototype
и this.__proto__.__proto__
было Object.prototype
Вот ссылка на сад Иди и прочитай.