原型的实际应用
1,将特有的属性 写在构造函数内部
特有属性 就是指 那些随着对象不同而发生变化的属性:比如 name,age,sex
2,将共有的属性 写在原型上
公有属性:同类对象,都有的属性,并且值相同,或者代码逻辑相同
一般对象的行为(方法)是公有的,都应该写到原型上,实现继承。
原型链
1,原型的本质也是对象,就具有__proto__属性。所以原型对象也有原型
2,任何对象都存在一条链,在这条链上都是原型。将这条链称为原型链。但是原型链不是无穷无尽的。尽头是Object.prototype。
3,默认原型对象的原型就是Object.prototype。
4,实质原型链是通过__proto__串联在一起的,同时原型链是用来体现继承关系的链式结构
属性搜索原则
当一个对象访问某个属性时,
1,首先在当前对象检索该属性。如果找到就使用。停止搜索
2,如果没找到,就像其原型搜索,就返回该属性值。找到就停止
3,如果没找到,就像其原型搜索,再没有,再往上,找到就返回该属性值。找到就停止。直到Object.prototype。没有就返回undefined
如果访问的属性是该对象不存在的属性,会检索整个原型链上的所有对象,会导致js性能降低。检索的属性在原型链上越是靠后,检索性能越低。
在访问属性时,靠前的原型上的同名属性,会覆盖后面原型上的值。
绘制原型链
1,写出原型链
2,将链上 的所有对象依次绘制出
instanceof运算规则
1,语法:<对象> instanceof 函数
2,用来判断对象是否为指定函数的实例。 返回布尔值
3,运算规则
如果函数的原型出现在该对象的原型链上的话,表达式返回值为true。否则false。
Object.prototype上一些方法
1,hasOwnProperty
*语法:<对象>.hasOwnProperty('propName')
*功能:用来判断,属性是自己的还是继承的
2,propertyIsEnumerable
*语法:<对象>.propertyIsEnumerable('propName')
*功能:是上一个方法的加强版。
*是自己属性
*而且是可枚举的。(使用 for in可遍历到的属性,即可枚举属性)
3,isPrototypeOf
*语法:<对象a>.isPrototypeOf(对象)
*功能:判断对象a是不是对象b的原型。
4,valueOf
*语法:<对象a>.isPrototypeOf()
*功能:将制定对象类型的数据,转换成基本类型
*规则:
*如果该对象是基本数据的包装类型,会转换成其对应的基本数据类型
*否则为其他对象类型,就直接返回该对象
5,。 toString
*语法:<对象>.toString()
*功能:负责展示对象的基本信息(对象的类型 type of 的返回值,以及其构造函数)
*返回值为“【typeof 的返回值 构造函数的额名字】”
函数
1,函数创建方式
*声明式
*函数表达式
*构造函数模式 var f =new Function();
2,Function构造函数
*语法 var f =new Function([argi~argN],body);
*[argi~argN] 类型为字符串,可选参数。用来定义生成函数f的形参
*body 类型为字符串,可选。用来实现函数体
*如果没有传参,生成一个没有形参
3,函数也是一种对象类型
eval方法
1,json数据
*以键值对形式存储数据。
*键 必须是字符串类型并且用两个双引号来表示字符串
*值 除了数字类型,其他都必须用双引号包裹起来。
2,json在数据传输时,客户端得到的是一个字符串类型,在实际操作时必须转换成对象才能解析数据。
3,由于eval方法可以将一段字符串就当做js代码来执行。因此使用json做数据传输的案例中,可以使用eval来将json字符串 转换成js对象
4.应用场景
在使用Ajax做无刷新页面时,通常使用json作为数据传输格式,所以要使用eval方法来将字符串转换成对象格式
5,在没有严格模式,eval可以随意指定一段字符串当做js代码来执行。
*脚步注入
*全局变量以及全局对象污染
eval创建变量的作用域 是有eval执行的作用域决定的
6,使用(new Function(str))();也可以将str字符串当做js代码来执行,同时他有一个好处-不会污染全局变量以及全局对象。
所有函数的原型都是Function.prototype.
Function() 本身也是函数对象。因此他也有__proto__属性。
一般函数都有prototype属性。但是Function.prototype这个
函数没有prototype属性。因为他是一个原型,具有原型属性。
网友评论