博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript学习笔记-原型继承
阅读量:6159 次
发布时间:2019-06-21

本文共 1807 字,大约阅读时间需要 6 分钟。

  hot3.png

    JavaScript基于原型的编程语言,本身并不包含内置的类实现。但是可以通过Javascript模拟出类

    JavaScript中有构造函数和New运算符。构造函数用来实例对象和初始化属性。任何JavaScript函数都可以用作构造函数,构造函数必须使用new运算符作为前缀来创建新的实例

    JavaScript要模拟一个类可以直接使用函数function

   

var Person = function(name){   this.name = name;}//实例化Personvar alice = new Person('alice');console.log(alice.name);

     这里需要注意的this关键字, new运算符会改变函数的执行上下文,同时改变return的行为。当使用new运算符来调用构造函数时,执行上下文this从全局对象编程一个空的上下文,这个上下文代表新生成的实例。因此this指向当前创建的实例。

     所以一下代码执行会出现undefined

var bob = Person('bob');console.log(bob.name);

原型   

 JavaScript本身是基于原型的编程语言,原型的作用:区别类和实例

var Animal = function(){}Animal.run = function(){    console.log('Animal run')}Animal.prototype.breath = function(){   console.log('animal breath');}Var Dog = function(){}//Dog继承自AnimalDog.prototype = new Animal();Dog.prototype.wag = function(){   console.log('dog wag');}var dog = new Dog();dog.wag();dog.breath();//继承的属性

输出:

dog waganimal breath

   那么通过类的prototype定义的方法或者属性就可以叫做所有实例的方法或属性,而其他的方法和属性就是类本身的方法和属性类比java类中的静态变量

这里对下面一些东西的叫法约定一下

通常按照个人习惯

构造函数/匿名函数

var Person = function(name){  this.name=name;}

函数/类

function Person(){}

对象/实例

var person = { name:'zhangsan',sex:'male'}

原型继承继承是的什么?

还是上面关于Animal和Dog的例子,我们做一些改造

var  animal = {        breath:function(){console.log('animal breath!')},};var Dog = function(){}//Dog继承自animalDog.prototype = animal;Dog.prototype.wag = function(){   console.log('dog wag');}var dog = new Dog();dog.wag();dog.breath();//继承的属性

结果和上面的一样

    在一个例子中我们使用 Dog.prototype = new Animail;   这个例子中我们使用的是Dog.prototype = animal

    区别在于第一个例子中的Animal是一个匿名类,通过调用new运算符调用其构造函数返回了一个animal实例,而第二个例子中animal本身就已经是一个实例/对象。这就是之前提到的new运算符的作用。

所以一个类的如果要继承另一个类那么就需要继承那个类的实例而不是类本身(Function),当然我们可以试一下直接使用Dog.prototype=Animal,结果就是当调用dog.breath();时直接返回的是一个Function对象,无法达到共享属性的意义。

   原型对象就是一个“模板”,定义在原型上的属性被用来初始化一个新的对象。任何对象都可以作为一个对象的原型对象,以此来共享属性。

   

转载于:https://my.oschina.net/fhck/blog/77091

你可能感兴趣的文章
<<Information Store and Management>> 读书笔记 之八
查看>>
Windows 8 开发之设置合约
查看>>
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>