继承
继承的实现方式
当前没有的属性和方法,别人有,拿过来用 ,就是继承
混入式继承
1 | for(var k in obj){ |
经典继承的实现
1 | // function jicheng(obj){ |
经典继承的语法
1 | //Object.create(obj) |
原型继承的实现
利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承
这种实现继承的方式,就叫做原型继承
1 | Person.prototype.sayHello = function () { |
1.给原型对象中添加成员(通过对象的动态特性) 不是严格意义上的继承
2.直接替换原型对象
注意:使用替换原型的方式实现继承的时候,原有原型中的成员就会丢失
1 | var parent = { |
继承的应用
开发人员A想要的sayHello 开发人员B想要的sayHello
如果直接修改内置对象的原型,会印象整个开发团队
扩展内置对象(就是给内置对象新增成员)如何安全的扩展一个内置对象?
1 | function MyArray() { |
接着就可以对myArr进行操作了
同理
1 | var arr = new Array(); |
原型链
原型链
什么是原型链
每个构造函数都有原型对象
//每个对象都会有构造函数
//每个构造函数的原型都是一个对象
//那么这个原型对象也会有构造函数
//那么这个原型对象的构造函数也会有原型对象
//这样就会形成一个链式的结构,称为原型链
原型链的基本形式
1 | function Person(name){ |
####.当访问一个对象的成员的时候,会现在自身找有没有,如果找到直接使用,
//2.如果没有找到,则去当前对象的原型对象中去查找,如果找到了直接使用,
//3.如果没有找到,继续找原型对象的原型对象,如果找到了,直接使用
//4.如果没有找到,则继续向上查找,直到Object.prototype,如果还是没有,就报错
原型继承概念
通过修改原型链结构实现的继承,就叫做原型继承
复杂的原型链
1 | //动物--->人---->老师---->坏老师 |
Object.prototype的成员
constructor
原型对象内的一个属性,指向该原型对象相关联的构造函数
hasOwnProperty
一个方法,用来判断对象本身(不包含原型)是否拥有某个属性
propertyIsEnumerable
- 判断属性是否属于对象本身
1 | console.log(p.propertyIsEnumerable("name")); |
valueOf
获取当前对象的值
在对象参与运算的时候
1 | //1.默认的会先去调用对象的valueOf方法, |
创建函数的几种方式
1 | 1.直接声明函数 |
Function的几种使用
0.一个参数都不传的情况 创建的就是一个空的函数
1 | //var 函数名 = new Function() |
1.只传一个参数的情况 这个参数就是函数体
//var 函数名 = new Function(“函数体”)
求数组中的最大值
var max = new Function(“arr”,
// “var maxNum = arr[0];” +
// “for(var i = 1;i<arr.length;i++){“ +
// “if(maxNum < arr[i]){“ +
// “maxNum = arr[i];” +
// “}” +
// “}” +
// “return maxNum;”
// )
console.log(max([1, 2, 3, 44, 5, 6]));
2.传多个参数的情况,最后一个参数为函数体,前面的参数都是该函数的形参名
1 | var sum = new Function("a", "b", "return a + b;"); |
arguments对象
利用 Function 创建一个函数,
要求允许函数调用时传入任意个数参数,
并且函数返回这些数字中最大的数字.
函数内部的一个对象 arguments
当函数调用的时候,系统会将所有传入的实参,依次存入这个数组对象
1 | function max(){ |
有无形参
1.一个函数有形参的时候,调用的时候,可以不传参数
2.一个函数没有形参的时候,调用时后,可以传参 arguments对象
3.一个函数不管有没有形参,调用的时候都会把实参的值存入arguments对象
arguments.length 表示传入实参的个数
arguments.callee 指向当前函数 (匿名函数中使用,因为他没有名字)
eval
val函数可以用来将字符串转换成JavaScript代码并且运行
1 | //JSON格式的数据 JSON对象有兼容性问题 |
使用eval来解析JSON格式字符串的时候,会将{}解析为代码块,而不是对象的字面量
1.在JSON格式的字符串前面拼接上 “var o =”
不推荐使用eval
静态成员和实例成员
静态成员和实例成员的概念,是从其他编程语言中引入的
静态成员:
//是指构造函数的属性和方法
实例成员:
是指实例的属性和方法
把工具方法,作为静态成员
把跟对象相关的方法,作为实例成员