首页 > 代码库 > javascript的oop——>>> [__proto__ 与 prototype/原型链/原型属性与原型方法/for-in循环]
javascript的oop——>>> [__proto__ 与 prototype/原型链/原型属性与原型方法/for-in循环]
前 言
OOP
javascript的oop中的__proto__ 与 prototype/原型链/原型属性与原型方法/for-in循环
1 __proto__ 与 prototype/原型链 |
1、prototype(函数的原型):函数才有prototype。prototype是一个对象,指向了当前构造函数的引用地址呢。
2、__proto__(对象的原型对象):所有对象都要__proto__属性。当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性,指上构造函数的prototype。
zhangsan.__proto__ == Person.prototype √
所有对象,最终都会指向Object()的prototype。
2 原型链 |
1、prototype(函数的原型):函数才有prototype。prototype是一个对象,指向了当前构造函数的引用地址呢。
2、__proto__(对象的原型对象):所有对象都要__proto__属性。当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性,指上构造函数的prototype。
zhangsan.__proto__ == Person.prototype √
所有对象,最终都会指向Object()的prototype。
3 原型属性与原型方法 |
1、成员属性、成员方法:
this.name = ""; this.func = function(){}
>>> 属于实例化出的对象的。通过"对象.属性"调用。
2、静态属性、静态方法:
Person.name = ""; Person.func = function(){}
>>> 属于类(构造函数)的。通过"类名.属性"调用。
3、私有属性、私有方法:
在构造函数中,使用 var num = 1; 声明。
>>> 只在构造函数内部能用,在外部无法通过任何方式访问;
4、原型属性、原型方法:
Person.prototype.name = "";
Person.prototype.func = function(){};
>>> 写在了构造函数的prototype上。当使用构造函数实例化对象事,该属性方法会进入新对象的__proto__上。
也就是说,1/4 使用对象可访问,2使用类名可访问,3只能在函数的{}内使用
5、 习惯上,我们会将属性写为成员属性,而方法写为原型方法;
例如: function Person(){
this.name = "zhangsan";
}
Person.prototype.say = function(){}
原因:
① 实例化出对象后,所有属性直接在对象上,所有方法都在__proto__上,非常直观清晰。
② 方法写到prototype上,要更加节省内存;
③ 使用for in 循环时,会将对象以及对象原型链上的所有属性和方法打印出来,而方法往往是不需要展示的。 将方法写到__proto__上,可以使用hasOwnProperty将原型上的方法过滤掉、不显示。
④ 官方都这么写。
6、 当访问对象的属性/方法时,会优先使用对象自有的属性方法。如果没有找到,便使用__proto__属性在原型上查找,如果找到即可使用。
但,当对象自身,以及__proto__上有同名方法,执行对象自身的。
7、可以通过prototype扩展内置函数的相关方法;
4 for-in循环 |
for-in循环,主要用于遍历对象。
for()中格式: for(keys in obj){}
keys表示obj对象的每一个键值对的键。所以{}中,使用obj[keys]读取每个值;
但是,使用for-in循环,不但能遍历对象本身的属性和方法,还能够遍历对象原型链上的所有属性方法。
可以使用hasOwnProperty判断一个属性,是否是对象自身的属性。
obj.hasOwnProperty(keys)==true 表示:keys是对象自身的一个属性
javascript的oop——>>> [__proto__ 与 prototype/原型链/原型属性与原型方法/for-in循环]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。