在面试中遇到过,问js如何实现继承,其实最好的方式就是构造函数+原型,今天在讨论中,发现自己以前理解上的一些误区,特地写出来,最近都比较忙,等手上的项目做完,可以来做个总结。
先说我以前没有认识到位的地方
1 __proto__这个不是标准实现的,但是各大浏览器和node都采用了,ECMA6计划标准化它,__proto__对应于标准中的[[prototype]],也就是所谓的内置原型属性,要把它和函数的prototype的相区别,其实,__proto__最终是指向Function.prototype的,这也是和js函数第一性对应的,js有函数化编程的基因。
2函数既有prototype属性也有[[prototype]]属性 也就是__proto__,其中prototype主要是为了实现类的继承,而__proto__只有对象才有,当然js中函数就是对象,所以函数也有__proto__,函数的__proto__就是指向Function.prototype的,对象只有__proto__,它是指向这个对象的构造函数的,对象没有prototype属性。
接着可以看一些简单的例子:
var Father=function(){//需继承的父类
this.gate ="ok";
} var One=function(){
this.person="no";
} One.prototype=new Father();//替换prototype属性的prototype对象 就差不多是你
//Object.creat()的实现 one=new One();//one的实例
console.log(one.gate);//输出ok 实现继承 console.log(One.prototype.constructor);//打印被替换的prototype.constructor,本应该是One
var two=new (one.__proto__constructor)//error 你产生的实际上是Father的实例
console.log(two.person);//undefined
console.log(one.prototype);//undefined
3注意new 构造函数f的时候,new分三步2,首先创建一个新对象,第二把新对象的__proto__中的构造函数替换成f.prototype.constructor,然后把f中的this相应的指向新对象的context
4可以看看ECMA5的Object.create的实现,加深理解
说一说js中__proto__和prototype以及原型继承的那些事的更多相关文章
-
js中__proto__和prototype的区别和关系?
_proto__(隐式原型)与prototype(显式原型)1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性 ...
-
js中 __proto__ 和 prototype
js中的对象都有__proto__属性存在[隐式原型],注意是两个_, 1,javascript对象的__proto__指向的是该对象的构造函数的原型对象,即constructor.prototype ...
-
关于js中__proto__和prototype的一些理解<;转>;
var Person = function(name) { this.name = name; } var p = new Person(); new操作符的操作是 var p = {} p. ...
-
理解js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__proto ...
-
[转载]js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...
-
js中__proto__和prototype constructor 的区别和关系
https://www.zhihu.com/question/34183746 javaScript原型.原型链的定义? prototype:每个函数都有一个prototype(显式原型),这个属性是 ...
-
js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别
__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性 ...
-
js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性_ ...
-
(转)js中__proto__和prototype的区别和关系
作者:doris链接:https://www.zhihu.com/question/34183746/answer/58155878来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
随机推荐
-
iOS 国际化(本地化)
转自http://www.cocoachina.com/industry/20140526/8554.html 简单说,国际化是一个应用程序国际兼容性设计的过程,比如: 1.以用户母语处理文本输入和输 ...
-
CSS预编译器:Sass(入门),更快的前端开发
SASs是由美国注册会计师协会(AICPA)下属审计准则委员会(ASB)发布,是为了便于注册会计师执行和落实一般公认审计准则(GAAS). Sass 扩展了 CSS3,增加了规则.变量.混入.选择器. ...
-
[c++项目]迷宫 控制台游戏
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #i ...
-
linux 网络管理的三种方式
修改网络IP的三种方式 1.修改配置文件 1.1dhcp自动获取 配置文件地址/etc/sysconfig/network-scripts TYPE=Ethernet #类型=以太网 PROXY_M ...
-
比较好用的Copy代码到博客VS扩展工具
这个工具叫做TrimCopy,可以避免拷贝出来的代码带空格,影响布局.
-
Packetbeat协议扩展开发教程(1)
Packetbeat ( https://www.elastic.co/products/beats/packetbeat )是一个开源的网络抓包与分析框架,内置了很多常见的协议解析,如HTPP.My ...
-
Spring3学习笔记--spring概述
Spring 是什么? Spring 是一个开源的轻量级 Java SE( Java 标准版本)/Java EE( Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.在传统应用程序 ...
-
CentOS 6.6下 BCM4312 802.11b/g无线网卡驱动安装
1.目前www.broadcom.com网站上最新版本为hybrid-v35,但此版本与2.6.32不匹配,无法识别验证密码,搜索网上说是要求升级内核,后根据http://www.dadclab.co ...
-
Apache Hadoop YARN – ResourceManager--转载
原文地址:http://zh.hortonworks.com/blog/apache-hadoop-yarn-resourcemanager/ ResourceManager (RM) is the ...
-
Katu Puzzle(POJ3678+2-SAT问题+tarjan缩点)
题目链接:http://poj.org/problem?id=3678 题目: 题意:给你a,b,c,op,op为逻辑运算符或.与.异或,使得a op b = c,让你判断这些运算符是否存在矛盾,不存 ...