84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
最近在学习JS的时候,发现prototype的意义不好理解,而且原型中也包含了众多的方法,从chrome后台调出来看到的原型方法简直多的惊人。由于还没有那么深刻的理解,所以希望大神讲解下原型存在的目的是什么?在什么环境下会用到prototype以及原型链?
闭关修行中......
贴一个阮大神的博客链接,个人感觉算是讲得比较清楚的一篇文章。如果你有其他语言OO编程的基础,你也可以用babel把es6语法下的class,extends转成es5,看看对应的实现,也是有助于理解的。阮一峰:Javascript继承机制的设计思想
其实我觉得原型就是把几个东西共用的方法或者属性给提炼出来,作为原型。写入原型就不用在实例化的时候在重复使用。
比如,对于Person来说,每个Person都有自己的名字,且每个人都希望浏览器能够输出自己的名字的sayName方法。如果将sayName方法写在Person里的话,每次实例化Person的时候都会包含这个方法,多个Person就有多次这个方法。如果写在Prototype里的话,每次实例化的时候不会包含这个方法,但是你使用的时候又可以从prototype中找到这个方法。
sayName
prototype
function Person(name) { this.name = name; this.sayName = function(){ alert(this.name); } }
function Person(name) { this.name = name; } Person.prototype.sayName = function(){ alert(this.name) }
你可以对比一下这两种写法,希望对你有帮助。
据说是为了简单……
是为了节约内存,20年前的内存还是很贵重的,比尔·盖茨曾预言“无论对于谁,640KB RAM都足够了”
目的就是公私分明啊,共有方法、或者公有变量写在原型上,然后各个实例共享,这样你就写一次一坨代码就行了;当然在继承的时候,如果超过三层发生,性能还不如直接new一个新父类。。
因為沒有類的結構,用prototype實現有類語言的繼承特性(創建構造器,指向對象)關於這點可以參考 《javascript the good part》函數一章
建议 阅读下 《JavaScript高级程序设计》 第6章。
贴一个阮大神的博客链接,个人感觉算是讲得比较清楚的一篇文章。如果你有其他语言OO编程的基础,你也可以用babel把es6语法下的class,extends转成es5,看看对应的实现,也是有助于理解的。
阮一峰:Javascript继承机制的设计思想
其实我觉得原型就是把几个东西共用的方法或者属性给提炼出来,作为原型。写入原型就不用在实例化的时候在重复使用。
比如,对于Person来说,每个Person都有自己的名字,且每个人都希望浏览器能够输出自己的名字的
sayName
方法。如果将sayName
方法写在Person里的话,每次实例化Person的时候都会包含这个方法,多个Person就有多次这个方法。如果写在Prototype里的话,每次实例化的时候不会包含这个方法,但是你使用的时候又可以从prototype
中找到这个方法。你可以对比一下这两种写法,希望对你有帮助。
据说是为了简单……
是为了节约内存,20年前的内存还是很贵重的,比尔·盖茨曾预言“无论对于谁,640KB RAM都足够了”
目的就是公私分明啊,共有方法、或者公有变量写在原型上,然后各个实例共享,这样你就写一次一坨代码就行了;当然在继承的时候,如果超过三层发生,性能还不如直接new一个新父类。。
因為沒有類的結構,用prototype實現有類語言的繼承特性(創建構造器,指向對象)
關於這點可以參考 《javascript the good part》函數一章
建议 阅读下 《JavaScript高级程序设计》 第6章。