__proto__与prototype
值得一说的是对象没有prototype属性,只有函数有prototype属性。
var a = function(){};
a.prototype.d = function(){
console.log();
}
prototype相当于给函数a添加了一个属性。
var a = function(){};
a.prototype.d = function(){
console.log();
} var b = new a();
b.d(); //
用prototype添加的属性,实例化后这个函数的对象也可以继承这个属性。
那为什么要用prototype添加属性呢?来看看
var a = function(){
var f = function(){
console.log();
}
}; var b = new a();
b.f(); //报错
为什么报错?先看一下call方法和new对象的关系这篇文章,看完你就明白b可以继承函数a的prototype属性了。
注意我那篇文章只说的了new可以继承prototype属性,但是没有说它可以继承函数里面的内容。所以为什么解决这个为什么我们就会用到prototype了,当然有时为了一些优化的原因也会这样用。
其实不只是prototype可以解决这个问题,还有this也是可以解决这个问题的,就像我们使用构造函数一样,我们都是用的this对吧,因为new以后就会改变这个this的指向,然后这个属性就会变成你创建出来的那个对象的属性。 对于this的指向问题可以看彻底理解js中this的指向,不必硬背。
function Fn(){
this.num = ;
}
var a = new Fn();
console.log(a.num); //
那么__proto__是什么?为了更好的理解__proto__建议你先看什么是作用域链这篇文章。
__proto__和作用域的行为类似,只不过__proto__是对于对象的属性来说的,而作用域链是对于变量来说的,什么意思?就是说一个对象如果要打印这个对象的某个属性,那么它会先在自己的对象中查找,如果没有找到那么它就会__proto__中找,看看有没有这个属性。那么__proto__中到底有哪些属性?
你一开始创建的对象__proto__指向了obj.__proto__,也就说明我们创建的任何对象都可以调用obj.__proto__里面的属性和方法,而obj的__proto__为null,也就是说到obj的__proto__就到头了。这也就是说如果我们没有做任何的操作,这个对象只能继承obj.__proto__的属性,这里没有算上obj的__proto__是因为,obj的__proto__为null。
但是如果我们用了new操作符实例化了一个函数,那么这个new出来的对象就又多了一个继承对象,那就是那个构造函数。而这个构造函数如果用prototype添加属性同样的,这个实例化的对象也可以继承它的属性。
还有一点就是如果这个对象本身就有这个属性就不会去继承,继承只有在这个对象没有找到的时候才会继承,就和我们学css的继承样式一样。
function Fn(){ }
Fn.prototype.num = ;
var a = new Fn();
a.num = ;
console.log(a.num); //
如果这个对象没有这个属性才会继承,并且这个对象有多个__proto__那么它也只是继承最近的那个属性。
function Fn(){ }
Fn.prototype.num = ;
var a = new Fn();
console.log(a.num);
在这段代码中Fn的__proto__离对象a最近所以继承它的,而不是obj的。
补充一点:
function Foo() {};
var foo = new Foo();
Foo.prototype.num = ;
console.log(foo.num); //52
console.log(Foo.num); //undefined
再看
function Foo() {};
var foo = new Foo();
Foo.prototype.num = ;
console.log(foo.num); //
console.log(Foo.prototype.num); //
对,你没有猜错,num只是prototype的属性,而prototype是Foo的属性,自然只能通过Foo.prototype.num来访问这个属性,那么为什么new出来的对象可以不用加prototype就可以访问num呢?
实际上new出来的对象是这样的。
var fn = function(a){
this.a = a;
}
var obj = {};
继承
obj.__proto__ = fn.prototype;
改变this指向
fn.call(obj);
看到没有,已经写了fn.prototype,自然就可以在后面点那个属性了。ok了吧?
__proto__与prototype的更多相关文章
- 谈谈__proto__和prototype的区别
我想javascript中的原型链一直想很多初学javascript的同学感到非常的困惑,今天看了一些文章,结合自己的理解,把原型链这个东西从新来整理一下,如有不对之处,望大家帮忙指出. 首先,我们应 ...
- JavaScript中__proto__与prototype的关系
一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 1 2 3 4 5 6 7 8 9 Number.__proto__ ...
- intanceof以及引出的__proto__和prototype
instanceof运算代码 function instance_of(L, R) { //L 表示左表达式,R 表示右表达式 var O = R.prototype; // 取 R 的显示原型 L ...
- 15条规则解析JavaScript对象布局(__proto__、prototype、constructor)
大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人 ...
- javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)
大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人 ...
- Javascript中的__proto__、prototype、constructor
今天重温了下Javacript,给大家带来一篇Javascript博文,相信对于Javacript有一定了解的人都听过prototype原型这个概念,今天我们深度的分析下prototype与__pro ...
- js中Object.__proto__===Function.prototype
参考:http://stackoverflow.com/questions/650764/how-does-proto-differ-from-constructor-prototype http:/ ...
- javascript中的__proto__和prototype
一.2个参考网址: http://icekiller110.iteye.com/blog/1566768 http://www.cnblogs.com/snandy/archive/2012/09/0 ...
- 关于 __proto__和prototype的一些理解
var Person = function(name) {}; Person.prototype.say = function() { console.log("Person say&quo ...
随机推荐
- HTML+CSS小实战案例
HTML+CSS小实战案例 登录界面的美化,综合最近所学进行练习 网页设计先布局,搭建好大框架,然后进行填充,完成页面布局 <html> <head> <meta htt ...
- Leetcode 165 Compare Version Numbers
题意:比较版本号的大小 有点变态,容易犯错 本质是字符串的比较,请注意他的版本号的小数点不知1个,有的会出现01.0.01这样的变态版本号 class Solution { public: int c ...
- HTML5之语义化标签
HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...
- 在C#中如何读取枚举值的描述属性
在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思.比如本文中枚举值 Chinese ,我们希望知道它代表意思的说明(即“中文”). 有下面的枚举: 1 2 3 4 5 6 ...
- Python:将utf-8格式的文件转换成gbk格式的文件
需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...
- 史上最强大的js图表库——ECharts带你入门(转)
出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 Sta ...
- XsdGen:通过自定义Attribute与反射自动生成XSD
前言 系统之间的数据交互往往需要事先定义一些契约,在WCF中我们需要先编写XSD文件,然后通过自动代码生成工具自动生成C#对象.对于刚刚接触契约的人来说,掌握XMLSpy之类的软件之后确实比手写XML ...
- 用C#表达式树优雅的计算24点
思路:一共4个数字,共需要3个运算符,可以构造一个二叉树,没有子节点的节点的为值,有叶子节点的为运算符 例如数字{1, 2, 3, 4},其中一种解的二叉树形式如下所示: 因此可以遍历所有二叉树可能的 ...
- .net微信公众号开发——模板消息
作者:王先荣 本文介绍微信公众号中的模板消息,包括以下内容:(1)TemplateMessage类简介:(2)设置所属行业:(3)获得模板id:(4)发送模板消息:(5)接收推送模板消息发送结果 ...
- Erwin 生成 mysql 带注释(comment )的脚本
Erwin设计数据库非常方便,有逻辑视图和物理视图,可以很方便的生成数据库文档和SQL 脚本.在使用过程中唯一不爽的地方是脚本不能生成comment. 在百度无数次无法解决下,又FQ谷歌,在一个日 ...