js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别
__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype)。
proterty:这个方法是对象的属性。(据说和一个对象的attr类似,比如dom对象中)
prototype:每个构造函数都有一个prototype对象,这个对象指向该构造函数的原型。
对象自身属性方法和原型中的属性方法的区别: 对象自身的属性和方法只对该对象有效,而原型链中的属性方法对所有实例有效。
例子:
function baseClass(){
this.age = 12;//构造方法里面的age属性
this.showMsg = function(){//构造方法里面的showMsg方法
console.log("baseClass::showMsg");
}
}
baseClass.prototype.say = function () {//原型上定义的say方法
console.log('test');
}
baseClass.prototype.age = 23;//原型上定义的name属性
function extendClass(){};//extendClass新的构造方法
var b = new baseClass();//实例化一个baseClass
console.log(b,121212);//此时b对象包含了baseClass构造函数中的属性和方法,不包含baseClass原型上的属性和方法,原型中的属性和方法为所有实例所共享,不会单独到实例化的对象身上,当在实例化对象中调用原型中的属性和方法时,可以通过原型链得到原型中的属性和方法(对象自身没有同名属性和方法的前提下,否则是实例自身的属性和方法
extendClass.prototype = b;//把extendClass的原型指向实例化的b,即extendClass的原型中就具备了b对象所有的属性和方法
var instance = new extendClass();//实例化一个extendClass实例instance此时instance应该是一个空对象,但是后面赋值了,这里也有值(不知道为啥,按道理js是顺序执行的),instance.__proto__属性指向的是extendClass的原型对象,而extendClass.prototype等于baseClass构造函数的实例,所以最后instance.__proto__属性指向了baseClass构造函数,instance.__proto__.__proto__指向了最初的原型对象
instance.showMsg(); // 显示baseClass::showMsg
instance.name = 'branchName';//instance实例的name属性
instance.age = 34;//instance实例的age属性
var instance2 = new extendClass();//实例化另一个extendClass对象instance2
instance.say();//say方法是最初原型对象的方法
baseClass.prototype.name = 'xiugai';//修改最初原型对象的name属性,修改该属性会影响所有实例化队形(实例化对象自身没有该属性的情况下)
console.log(instance.name,instance.age);//name取的是instanace对象自身的name值‘branchName’,age同理
console.log(instance2.name,instance2.age);//instance取的是构造方法baseClass的原型对象上面的name值‘xiugai’,age取的同样是baseClass原型对象上的age,值为‘12’
baseClass.prototype.name = 'zaicixiugai';
console.log(instance2.name);//此时name变成了‘zaicixiugai’
var instance3 = new extendClass();
console.log(instance3);//instance3是一个空对象,它的原型链最终指向了baseClass的原型对象
给构造函数的prototype赋值的时候不能直接用
object.prototype = {}赋值,
如果这样赋值要加一行constructor属性,否则会覆盖掉object本身的原型指向。
js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别的更多相关文章
- js中__proto__和prototype的区别和关系? 这样好理解多了
原型的概念 真正理解什么是原型是学习原型理论的关键.很多人在此产生了混淆,没有真正理解,自然后续疑惑更多. 首先,我们明确原型是一个对象,其次,最重要的是, Every function has a ...
- JS中面向对象的,对象理解、构造函数、原型、原型链
6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属 ...
- js中__proto__和prototype的区别和关系?
_proto__(隐式原型)与prototype(显式原型)1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性 ...
- 理解js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__proto ...
- [转载]js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...
- 说一说js中__proto__和prototype以及原型继承的那些事
在面试中遇到过,问js如何实现继承,其实最好的方式就是构造函数+原型,今天在讨论中,发现自己以前理解上的一些误区,特地写出来,最近都比较忙,等手上的项目做完,可以来做个总结. 先说我以前没有认识到位的 ...
- js中__proto__和prototype constructor 的区别和关系
https://www.zhihu.com/question/34183746 javaScript原型.原型链的定义? prototype:每个函数都有一个prototype(显式原型),这个属性是 ...
- js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...
- (转)js中__proto__和prototype的区别和关系
作者:doris链接:https://www.zhihu.com/question/34183746/answer/58155878来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
随机推荐
- FOR UPDATE
1. for update的使用场景 `如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的. 比如涉及到金钱.库存等.一般这些操作都是很长一串并且是开启 ...
- 为什么有logistics函数
直观地看: 如果是softmax函数,我想有跟多的选择方向吧
- 《DSP using MATLAB》第2章习题Problem2.1
1.代码: %% ------------------------------------------------------------------------ %% Output Info abo ...
- 集合(List、Set、Map)
List,Set是继承自Collection接口,Map不是 public interface List<E> extends Collection<E> { public i ...
- 【python】使用Python中的urlparse、urllib抓取和解析网页
一.解析URL 函数urlparse(urlstring [, default_scheme [, allow_fragments]])的作用是将URL分解成不同的组成部分,它从urlstring中取 ...
- selenium+python 移动鼠标方法
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver=we ...
- java Long
1. Long.valueOf(b) 返回的是对象 public static Long valueOf(String s) throws NumberFormatException { )); } ...
- C#两个日期范围内的间隔
http://www.cnblogs.com/love_study/archive/2011/04/02/2003045.html 引用地址 1 /// <summary> /// 计算日 ...
- postman 获取时间戳的方法 和md5加密的方法
获取时间戳方法: postman.setGlobalVariable("timestamp",Math.round(new Date().getTime())); 这整句是获取 ...
- 十一、jdk命令之Jstatd命令(Java Statistics Monitoring Daemon)远程的监控工具连接到本地的JVM执行命令
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...