js中的原型,原型链和继承】的更多相关文章

1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this.name = name; this.age = age; this.run = function () { console.log(`${this.name} --- ${this.age}`) } } // 原型链上面的属性和方法可以被多个实例共享 Person.prototype.sex = '…
1>首先,我们先将函数对象认识清楚: 补充snow的另一种写法: var snow =function(){}; 2>其次:就是原型对象 每当我们定义一个函数对象的时候,这个对象中就会包含一些内置的属性,其中有一个属性叫prototype(原型对象) 原型对象不是谁都有的,是函数对象特有的 ,普通对象没有.但是普通对象有一个__proto__属性(叫原型) 所有对象都有__proto__属性(原型). 总结:函数对象有原型对象(prototype)属性和原型对象中的原型(__proto__)属…
在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于‘类的',而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能…
js中每一个构造函数都有一个prototype的属性,prototype指向一个对象,而这个对象的属性和方法都会被构造函数的实例所继承,因此,需要一些共享的属性和方法可以写在构造函数的原型中 1  用prototype属性可以向构造函数添加可继承的属性和方法,注意constructor属性指向prototype对象所在的函数 <script> function Person(){ } Person.prototype = { constructor: Person, name: 'xxx',…
首先,js中给原型对象添加属性和方法. 方式一:对象的动态特效 给原型对象添加成员 语法:构造函数.prototype.方法名=function (){ } 方式二:替换原型对象(不是覆盖,而是替换,把原先的同名的直接替换成现在的) 语法:构造函数.prototype.方法名={ } tips:方式二不常用,因为这样会修改了原型本身 搜索:JS中通过构造函数添加成员方法和通过原型法添加成员方法的区别 参考网址  http://blog.csdn.net/xxmzumeng/article/det…
JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初始化参数,而不能通过构造函数来初始化参数了 init: function(who) { this.me = who; }, identify: function() { return "I am " + this.me; } }; Bar = Object.create(Foo); //…
对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var arr = new Array(); 3.使用 Object.create() 这个方法有两个参数,第一个参数是这个对象的原型,第二个参数用以对对象的属性进行进一步描述(可选) }); var obj1 = Object.create(null); console.log(obj instanceof…
经常在前端面试或是和其他同行沟通是,在谈到构造在JS定义构造函数的方法是最好使用原型的方式:将方法定义到构造方法的prototype上,这样的好处是,通过该构造函数生成的实例所拥有的方法都是指向一个函数的索引,这样可以节省内存. 当然,这种说法没有任何问题,只是在实现上,并非只有使用prototype的方式才能达到这样的效果,我们可以将方法以函数的形式定义在构造函数之外,然后在构造函数中通过this.method = method的方式,这样生成的实例的方法也都通过索引指向一个函数,具体如下:…
一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) Number.__proto__ === Function.prototype  // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype  // true Object.__proto__ === Function.prototy…
构造函数与原型对象的同名属性,实例会取哪一个? 看了下面的过程,再回忆JS高程3里关于这部分的示意图.实例my在new的时候,本身就获得了a属性,所以my.a是1,倘若在new的时候如果没有赋予a属性,则会从原型上搜索a属性,my.a是2.为什么有这个问题?因为在研究ES6和React中this的时候,碰到了这个易出错的地方. function A() { this.a = 1; //注释掉这句就从原型上获取了 } A.prototype.a = 2; var my = new A(); con…
第一种: function Person() { this.username = new Array(); this.password = "123"; } Person.prototype.getInfo = function() { alert(this.username + ", " + this.password); } var p = new Person(); var p2 = new Person(); p.username.push("zh…
大家好,今天我带大家学习一下js的OOP, 大家都知道,面向对象有三个基本特征,继承,封装和多态,面向对象的语言有那么几种,C++,PHP,JAVA等,而功能强大的JS可以模拟实现面向对象的两大特征,继承,和封装,无法实现多态,所以当有人对问你,js是一门面向对象的语言,你应该反驳他,js是一门基于对象的语言,不是面向对象,他就会觉得你很有学问.哈哈! 首先,我们学习一下,什么是对象呢,那就先了解一下类和对象是什么? 1.类:一类具有相特征(属性)和行为(方法)的集合 eg:人类--->属性,身…
大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类,然后我们通过类来进行实例化对象,通俗的说创建对象吧,我们以前用过的json对象,和我们现在要用的标准对象 //简单的json对象(此对象与Person类没任何关系,只是让大家观察两者的写法区别) var obj = { name:‘lemon’, age:'18' } //通过Person来实例化…
通过call或者apply可以实现函数里面this的改变,利用这一特点,可以实现继承 代码如下所示: /*父类*/ function Parent(add,net,no,teacher) { this.add = add; this.net = net; this.no = no; this.teacher = teacher } /*子类*/ function Child(name,age,sex,id) { this.name = name; this.sex = sex; this.age…
1.执行环境(execution context) 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为.每个执行环境都有与之对应的变量对象(variable object),保存着该环境中定义的所有变量和函数.我们无法通过代码来访问变量对象,但是解析器在处理数据时会在后台使用到它. 执行环境有全局执行环境(也称全局环境)和函数执行环境之分.执行环境如其名是在运行和执行代码的时候才存在的,所以我们运行浏览器的时候会创建全局的执行环境,在调用函数时,会创建函数执行环境. 1.1 全局执…
在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让原型对象的写法更加清晰.更像面向对象编程的语法而已. 1.构造函数的简单介绍 构造函数就是提供了一个生成对象的模…
JS是一种基于对象的语言.在使用过程中不免遇到复制对象的问题.但通常我们採用的直接赋值'obj1=obj2'这样的做法会出现数据覆盖问题. 也就是对象引用过程中引用地址一致.导致对象数据被改动的问题.这时我们能够採用工厂模式来对对象进行实例化,从而实现对象的引用地址一致导致的数据覆盖问题. 但此时,问题随之又来了,使用工厂模式,对于详细的实例所属的详细对象又搞不清楚,在JS中採用构造方法来解决对象实例的数据覆盖问题(这里和其他语言的原理是类似的). 一.构造函数 在其他语言中接触过构造函数.通常…
内容要点: 1.什么是对象:JS权威指南学习总结-第六章 ,(有句话:一切都是对象) 2.什么面向对象 使用对象时,只关注对象提供的功能,不关注其内部细节,比如jQuery.面向对象是一种通用思想,并非只有编程中使用,任何事情都可以用. 3.JS中面向对象三大特征: 封装.继承.多态 4.JS自定义对象(三大对象两大属性): 4.1创建对象方式:方法1:对象初始化的方法,就是通过对象直接量创建的对象.方法2:通过关键字new和构造函数的方法创建对象 4.2对象属性定义:私有属性.对象属性.类属性…
当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型,我们可以通过找原型进行继承的方法,在不对B中的属性或方法重写的前提下实现对A函数的继承. 那么我们构造一个函数:属性写在函数内,方法写在原型(.prototype)中,这样我们可以通过一级一级的找原型来实现继承. function Baby(name,isMale,birthdate){ this.…
1.对象 在传统的面向过程的程序设计中,会造成函数或变量的冗余.而JS中对象的目的是将所有的具有相同属性或行为的代码整合到一起,形成一个集合,这样就会方便我们管理,例如: var person1={    name:"tan",    age:26,    showMessage:function(){        alert("name:"+this.name);    }};person.showMessage();//输出name:tan 以上的例子将nam…
ECMAScript中将原型链作为实现继承的主要方法,其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 1.原型链 先回忆一下构造函数和原型以及实例的关系:每个构造函数都有一个原型对象,原型对象中有一个指向构造函数的指针,而所有实例都有一个指向原型对象的内部指针. 那么实现 原型链的具体操作是这样的:让构造函数的原型对象等于另一个类型的实例.此时,原型对象将包含一个指向另一个原型的指针,另一个原型中也包含这一个指向另一个构造函数的指针. 如果另一个原型又是再另一个类型的实例的话…
1.继承 应注意区分继承和实例化,实例化是生成一个对象,这个对象具有构造函数的属性和方法:继承指的应该是利用父类生成一个新的子类构造函数,通过这个子类构造函数实例化的对象,具有子类的属性和方法,同时也具有父类的属性和方法. 2.原型链继承 2.1.实现方法 实现原型链继承的方法是通过重写子类的原型对象(比如 Student.prototype )的值为父类(比如Person) 的一个实例,由此可以实现继承(Student 继承了 Person ) . Son.prototype = new Pa…
转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西.一般人们叫它函数.比如下面的代码 js代码: function Person(name) { alert(name); } Person('js');//js 上面的代码中,Person的表…
最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享, 一.instanceof 在JavaScript有instanceof运算符,是二元运算符,使用方法 instanceA instanceof A,返回值是布尔值(boolean),含义是判断instanceA是否是A的一个实例,其实质是判断A.prototype===instanceA.__p…
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在.然后我们定义一个函数foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例化的对象可以共享…
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天要讨论的主题,有许多人写过许多精彩的文章,但是今天我还是想把自己的理解的知识记录下来.我在学习 掌握JS原型链和继承的时候,就是看得@阮一峰老师的写的文章,觉得他写的技术类的文章都容易让理解,简明概要,又好理解.他是我学习JS路程里面一个比较佩服的导师,昨天重新看了他写的<Javascript 面向…
理解原型链 在 JavaScript 的世界中,函数是一等公民. 上面这句话在很多地方都看到过.用我自己的话来理解就是:函数既当爹又当妈."当爹"是因为我们用函数去处理各种"粗活累活"(各种工具函数.页面交互.业务逻辑等):"当妈"是因为函数还会"生孩子"(创建对象). 在 JavaScript 的世界中,每一个对象都有一个隐藏的__proto__属性.这个属性指向生成这个对象的构造函数的原型(prototype).事实上,所…
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var obj = { name: "obj" }; 我们通过控制台把 obj 打印出来: 我们会发现 obj 已经有几个属性(方法)了.那么问题来了:valueOf / toString / constructor 是怎么来?我们并没有给 obj.valueOf 赋值呀. 上面这个图有点难懂,我手画…
对象的特性: 1.唯一标识性,即使完全不一样的对象,内存地址也不同,所以他们不相等 2.对象具有状态,同一个对象可能处在不同状态下 3.对象具有行为,即对象的状态可能因为他的行为产生变迁 Js直到es6之前,有对象的概念,但是没有类的概念. 对象的分类: 1.内建对象 - 用Es标准中定义的对象,在任何的Es的实现中都可以使用(比如:Math,String,Number,Boolean,Function...) 2.宿主对象 -用Js运行环境提供的对象,目前来讲主要是指用浏览器提供的对象(BOM…
js继承01 思路: 单例/工厂/构造函数--演进到原型 搞清原型结构 原型继承 模拟系统原型继承 实现自己的继承 观察原型继承特点 演进到原型链这一步 //单例模式: 防止变量名冲突: // 思路: 本空间调用其他空间的方法-->本空间调用自己空间的方法 /*var utils = { show: function () { console.log('utils.show'); } }; var search = { show2: function () { console.log('sear…