我不太喜欢动态编程语言,但我已经编写了相当多的JavaScript代码。我从未真正了解过这种基于原型的编程,有人知道它是如何工作的吗?
var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
我记得前一段时间我和人们进行了很多讨论(我不太确定我在做什么),但据我所知,没有什么课的概念。它只是一个对象,这些对象的实例是原始对象的克隆,对吗?
但JavaScript中这个“.prototype”属性的确切用途是什么?它与实例化对象有什么关系?
更新:正确方式
var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!
function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK
这些幻灯片也帮了大忙。
每个对象都有一个内部属性[[Prototype]],将其链接到另一个对象:
object [[Prototype]] → anotherObject
在传统javascript中,链接对象是函数的原型属性:
object [[Prototype]] → aFunction.prototype
某些环境将[[Prototype]]公开为__proto__:
anObject.__proto__ === anotherObject
创建对象时创建[[Prototype]]链接。
// (1) Object.create:
var object = Object.create(anotherObject)
// object.__proto__ = anotherObject
// (2) ES6 object initializer:
var object = { __proto__: anotherObject };
// object.__proto__ = anotherObject
// (3) Traditional JavaScript:
var object = new aFunction;
// object.__proto__ = aFunction.prototype
因此,这些陈述是等价的:
var object = Object.create(Object.prototype);
var object = { __proto__: Object.prototype }; // ES6 only
var object = new Object;
您实际上无法在新语句中看到链接目标(Object.prototype);相反,目标由构造函数(Object)暗示。
记得:
每个对象都有一个链接[[Prototype]],有时公开为__proto__。每个函数都有一个原型属性,最初持有一个空对象。使用new创建的对象链接到其构造函数的原型属性。如果函数从未用作构造函数,则其原型属性将不被使用。如果不需要构造函数,请使用Object.create而不是new。
每个对象都有一个内部属性[[Prototype]],将其链接到另一个对象:
object [[Prototype]] → anotherObject
在传统javascript中,链接对象是函数的原型属性:
object [[Prototype]] → aFunction.prototype
某些环境将[[Prototype]]公开为__proto__:
anObject.__proto__ === anotherObject
创建对象时创建[[Prototype]]链接。
// (1) Object.create:
var object = Object.create(anotherObject)
// object.__proto__ = anotherObject
// (2) ES6 object initializer:
var object = { __proto__: anotherObject };
// object.__proto__ = anotherObject
// (3) Traditional JavaScript:
var object = new aFunction;
// object.__proto__ = aFunction.prototype
因此,这些陈述是等价的:
var object = Object.create(Object.prototype);
var object = { __proto__: Object.prototype }; // ES6 only
var object = new Object;
您实际上无法在新语句中看到链接目标(Object.prototype);相反,目标由构造函数(Object)暗示。
记得:
每个对象都有一个链接[[Prototype]],有时公开为__proto__。每个函数都有一个原型属性,最初持有一个空对象。使用new创建的对象链接到其构造函数的原型属性。如果函数从未用作构造函数,则其原型属性将不被使用。如果不需要构造函数,请使用Object.create而不是new。
如果您想从基础上理解原型和基于原型的继承的概念,请查看MDN官方文档,它们解释得很好。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
谈到继承,JavaScript只有一个构造:物体。每个对象都有一个私有属性,该属性包含指向另一个对象称为原型。该原型对象具有原型,依此类推,直到使用null到达对象作为其原型。根据定义,null没有原型,并且充当原型链中的最后一个环节。
此外,这里还有另一个很好的资源,可以使用简单的示例进行解释https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes