我不太喜欢动态编程语言,但我已经编写了相当多的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
这些幻灯片也帮了大忙。
摘要:
函数是javascript中的对象,因此可以具有财产(构造函数)函数始终具有原型属性当函数用作带有new关键字的构造函数时,对象将获得原型。可以在新创建的对象的__proto__属性中找到对该原型的引用。此__proto__属性引用构造函数的原型属性。
例子:
职能人员(姓名){this.name=名称;}let me=新人('willem');console.log(Person.prototype)//Person具有prototype属性console.log(Person.prototype==me.__proto__)//实例的__proto__属性引用函数的原型属性。
为什么这很有用:
Javascript在查找Objects上的财产时有一种机制,称为“原型继承”,其基本功能如下:
如果属性位于Object本身,则选中First。如果是,则返回此属性。如果属性不位于对象本身,它将“爬上协议链”。它基本上看proto属性所指的对象。在那里,它检查proto引用的对象上的属性是否可用如果属性不位于原型对象上,它将沿着原型链一直爬到对象对象。如果在对象及其原型链上找不到属性,则返回undefined。
例如:
职能人员(姓名){this.name=名称;}let mySelf=新人('Wilem');console.log(mySelf.__proto__==Person.prototype);console.log(mySelf.__proto__.__proto__==对象.原型);
更新:
__proto__属性已被弃用,尽管它在大多数现代浏览器中实现,但获取原型对象引用的更好方法是:
对象.getPrototypeOf()
原型允许您创建类。如果不使用原型,那么它将成为静态的。
这里有一个简短的例子。
var obj = new Object();
obj.test = function() { alert('Hello?'); };
在上面的例子中,您有静态函数调用测试。该函数只能由obj.test访问,您可以将obj想象为一个类。
其中如下代码所示
function obj()
{
}
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
obj已成为一个现在可以实例化的类。可以存在多个obj实例,它们都具有测试功能。
以上是我的理解。我正在把它做成一个社区维基,所以如果我错了,人们可以纠正我。
我总是喜欢用类比来理解这类事情在我看来,原型继承与类低音继承相比非常令人困惑,尽管原型是更简单的范例。事实上,对于原型来说,确实没有继承,因此名称本身就具有误导性,更像是一种“委托”。
想象一下。。。。
你在上高中,你在课堂上,有一个今天到期的测验,但你没有笔来填写你的答案。多!
你坐在你的朋友芬尼乌斯旁边,他可能有一支笔。你问,他环顾了一下他的桌子,但没有成功,但他不是说“我没有笔”,而是一个很好的朋友,他会和他的另一个朋友Derp检查是否有笔。德普确实有一支备用笔,并将其交给芬尼乌斯,后者将其交由你完成测验。德普已将笔交给芬尼乌斯,后者已将笔委托给你使用。
这里重要的是,德普不会把笔交给你,因为你和他没有直接关系。
这是原型如何工作的一个简化示例,其中搜索数据树以查找您要查找的对象。