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来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
随机推荐
- PostgreSQL truncate table会释放索引的空间
apple=# create table test(id integer, info text); CREATE TABLE apple=# insert into test select gener ...
- PHP迭代器的小坑
使用PHP迭代器的时候,需要主要到很多迭代器是对内部迭代器的封装,当外部迭代器移动的时候,实际上也是在移动内部迭代器. 示例一:命令行 &"C:\wamp64\bin\php\php ...
- JDk和Mevan安装和配置
一.Mevan安装和配置 1.下载Maven 官方下载地址:http://maven.apache.org/download.html 选择你所希望下载的版本,并保存到常用安装目录.这里以Maven ...
- Python面试题(十三)
1.用最简洁的方式初始化这样一个变量:foo = [4,16,36,64,100] [i*i for i in range(2,12,2)] 答案 2.使用生成器编写fib函数,函数声明为fib(ma ...
- ACM学习历程—HDU2476 String painter(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...
- POJ1236学校网络——tarjan
题目:http://poj.org/problem?id=1236 Tarjan+缩点.温习一下Tarjan的写法. 1.在缩点后的TAG中,有几个联通块等价于有几个入度为0的点! 2.把它们都联通相 ...
- 【linux】文档查看
cat: [root@localhost test]# cat log2013.log 2013-01 2013-02 2013-03 [root@localhost test]# cat -n lo ...
- GCC 三
前记: 经常浏览博客园的同学应该会觉得本文有标题党之嫌,这个标题的句式来自于MiloYip大牛的大作<C++强大背后>,在此,向Milo兄致意. GCC,全称GNU Compiler Co ...
- php7新特性一览
1.太空船操作符 用于比较2个表达式,例如当\(a小于,等于或大于\)b时,分别返回-1,0,1 php echo 1 <=> 1; //0 echo PHP_EOL; echo 1 &l ...
- Bootstrap-CL:列表组
ylbtech-Bootstrap-CL:列表组 1.返回顶部 1. Bootstrap 列表组 本章我们将讲解列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: ...