Object 原型中的常用方法
1、constructor
语法:构造函数.prototype.constructor,
作用:指向构造函数本身
function Person(){} console.log( Person === Person.prototype.constructor );//true
2、hasOwnProperty
语法:对象.hasOwnProperty( 属性名字 )
作用:检测属性为对象原生提供还是继承所得
function Person () {} Person.prototype.name = "landmine"; var p = new Person(); p.age = 18; console.log(p.hasOwnProperty("name")); //false console.log(p.hasOwnProperty("age")); //true
3、isPrototypeOf
语法:对象1.isPrototypeOf( 对象2 )
作用:判断对象1是否为对象2的原形对象
function Person () {} var p = new Person(); console.log( Person.prototype.isPrototypeOf(p) );//true
4、propertyIsEnumerable
语法:对象.propertyIsEnumberable( 属性名字 )
作用:原生属性是否可以枚举, 原生属性是否可以被 for-in 遍历到,不可枚举或不存在该属性或者不是原生属性则返回false
function Person () { this.age = 18 } var p = new Person(); p.name = "landmine"; console.log(p.propertyIsEnumerable( "name" )); //true console.log(p.propertyIsEnumerable( "age" ));//false console.log(p.propertyIsEnumerable( "gender" ));//false
原型链
1、对象都有原型对象, 对象默认继承自原型对象
2、 函数被定义后, 默认就有原型属性, 原型属性也是对象
3、函数的原型属性默认继承自 Object.prototype
4、原型对象中 constructor 指向对应的构造函数
5、 所有的函数都是 Function 的实例
6、 函数也是对象,所有函数的属性默认继承自Function.Prototype
7、Function本身也是函数。即Function.__prototype === Function.Prototype
基本的概念
prototype 是函数的原型属性, 是该函数创建的对象的原型对象
__proto__ 是对象的原型对象, 是创建该对象的构造函数的 原型属性
原型链图
instanceof运算符
语法:对象 instanceof 构造函数
作用:判断构造函数是否在对象的原形链上
function Foo() {} function Fn() {} var f1 = new Fn(); console.log( f1 instanceof Fn )//true console.log( f1 instanceof Object )//true console.log( f1 instanceof Foo )//false Fn.prototype = new Foo();//修改函数的原形链 var f2 = new Fn(); console.log( f1 instanceof Foo )//false console.log( f2 instanceof Foo )//true
当Fn原形属性被更改至Foo后,Foo就在重新声明的f2的原型链上,而f1的原型链并没有更改,Foo并没有在f1的原型链上。
修改原型链也可以直接修改对象的__proto__属性,在上面代码的基础上添加如下代码后,Foo也存在f1的原型链上。
F1.__proto__ = new Foo();
console.log( f1 instanceof Foo ) // true
new Function创建函数
语法: var 函数名 = new Function( arg1, arg2, arg3, ..., argN, body );
作用:创建函数,参数列表中最后一个位函数的内容,其他为函数的参数。
var fnMax = new Function( ‘a‘, ‘b‘, ‘return a > b ? a : b;‘ ); var res = fnMax( 1, 2 ); console.log(res); // 2