Tra*_*vis 5 javascript oop prototype
我对javascript中"原型"的概念感到困惑.
当我定义一个对象时,以下两个似乎都有效:
myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };
Run Code Online (Sandbox Code Playgroud)
和...
myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };
Run Code Online (Sandbox Code Playgroud)
谁能对此有所了解?这两种创建对象的方式究竟有什么区别,为什么我会选择另一种呢?(我觉得这种感觉很重要......)
谢谢!
您应该prototype仅在构造函数上使用该属性,而不是在对象实例中,例如:
function Test () {}
Test.prototype.method1 = function () {/*...*/};
var obj = new Test();
Run Code Online (Sandbox Code Playgroud)
prototype构造函数的属性由new运算符在创建新对象实例时使用.
所有本机对象都有一个隐藏的链接,用于构建原型链.
对象之间的这个隐藏链接是[[Prototype]]内部属性,new操作员是唯一可以设置它的人.
在上面的示例中,obj内部与它的构造函数原型相关联,method1可以从中访问obj,但它在物体上不存在,该方法存在于Test.prototype对象上,并通过原型链检索,例如:
typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true
Run Code Online (Sandbox Code Playgroud)
在对象实例上,分配prototype属性是没有意义的,它将被视为与任何其他属性名称一样:
var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";
// myObject is simply {"prototype":"foo","bar":"bar"}
Run Code Online (Sandbox Code Playgroud)