js原型链(2)

来源:互联网 发布:王家湾汉江公寓网络 编辑:程序博客网 时间:2024/06/06 15:04

A函数原型属性剖析

1.name属性和construct属性

Person.prototype.name=='Person'//具有兼容性问题

Person.construct==function Function() { [native code] }

typeof Person.construt=="function"

B对象的继承

1.组合式继承,由于一个对象可以继承自任意的对象,即:o可以继承自对象o1,o2,o3...,所以,把这种继承称为:组合式继承。

var o1 = {name:"女娲", age: 1, gender: "female"};var o2 = {grade: "三年级二班", score: 100};// o2 继承 o1for ( var k in o1 ) {  o2[k] = o1[k];}// 如果希望 o2 可以继承自任意的对象. 所以为了简化继承的代码// 给 o2 提供一个方法, 叫 extendo2.extend = function (obj) {    for (var k in obj) {        this[k] = obj[k];    }   }o2.extend(o1);  // 继承

2.原型继承,如果需要让一个对象拥有某些属性和方法,可以把这些属性和方法放到原型对象中,因为对象会继承自原型对象,所以就获得了该属性和方法。把这种继承方式称为:原型继承

  2.1利用对象的动态特性添加成员

// 对象的动态特性var o = {};o.name = "Jim";o.age = 29;o.gender = "男";// -----------------------function Person() {}// 将需要的属性添加到原型对象中Person.prototype.sayHi = function() {};var p = new Person();p.sayHi();
2.2覆盖原型对象

Person.prototype = {    sayHi: function() {},    sayNo: function() {},    sayYouAgin: function() {}}
 注意:
使用覆盖原型对象方式实现继承的时候, 要给这个新对象添加一个 constructor 属性(属性的值为:当前的构造函数)
目的是保持和 默认情况的原型结构一样(模拟对象的类型);但是如果对对象的类型要求不严格可以忽略 constructor: Person

2.3经典继承 - Object.create

作用:实现继承,即:让一个对象继承自另外一个对象
缺点:类型无关,即:创建的新对象是"没有"类型(类型是 object)直接继承自Object.prototype.

var o1 = {     sayHi: function() {        alert("hello,i am chuanchuan");    }};var o2 = Object.create(o1);
C 原型链的概念

对象有原型对象,原型对象也是对象,所以,原型对象也有原型对象,这样一环扣一环,就形成了一条链式结构,叫做:原型链

此时的原型继承理解:
任何对象都有一条原型链存在,所谓的继承就是通过任何手段,改变原型链的层次结构,
那么,对象通过访问原型链中的属性或者方法,从而实现继承

var o = new Object();// 原型链结构// o -> Object.prototype -> nullvar arr = []; // new Array()// 原型链结构// arr -> Array.prototype -> Object.prototype -> null// 

说明:原型链结构的最上层是 Object.prototype,任何对象都直接或间接的继承自 Object.prototype

D 构造函数和原型的一些结论

1 只要是函数 就有 prototype 属性
2 函数的属性 prototype 是一个对象类型
3 属性 prototype 是一个含有 constructor 和 __proto__ 属性的对象
4 constructor 属性就是当前构造函数
5 函数的 prototype 属性所表示的对象继承自 Object.prototype

E: Object.prototype 常用成员

1. hasOwnProperty

判断有没有指定的属性, 如果属性是对象自身提供的,返回true; 否则,返回false

语法:
boolean 对象.hasOwnProperty(属性名)

var o = {name: "abc"};var hasName = o.hasOwnProperty("name");console.log(hasName);//true 
2. isPrototypeOf

判断 对象1 是否为 对象2 的原型对象, 如果是返回 true, 否则返回 false
语法:
boolean 对象1.isPrototypeOf( 对象2 );
function Person() {}var p = new Person();console.log(Person.prototype.isPrototypeOf(p)); //trueconsole.log(Person.prototype.isPrototypeOf(Person));//false----------------------------var o = {};Person.prototype = o;var p = new Person();console.log(o.isPrototypeOf(p));//true


3.instanceof 运算符

用来检测 构造函数的prototype属性所指向的对象 是否存在于 被检测对象 的原型链上。
规律:
    1 创建对象以后,没有给其构造函数的prototype属性重新赋值,那么,返回 true
    2 创建对象时构造函数的prototype属性所指向的对象


function Fn() {}// 1var f = new Fn();console.log(f instanceof Fn); // true// 2function Foo() {}// 修改 Fn.prototype 的指向Fn.prototype = new Foo();console.log(f instanceof Fn); // false// 3var f1 = new Fn();console.log(f1 instanceof Fn); // true

4.valueOf


    var obj = {};     console.log(+obj); // NaN     console.log(obj.valueOf());Object     console.log(obj.toString());[object Object]     console.log(num + obj); // 1[object Object]    var obj = {    /*valueOf: function() {    return 2;    },*/    toString: function() {    return "456";    }    };    // 首先调用 valueOf方法,不成功的话,就调用 toString()    console.log(num + obj); // 1 + "456" => "1456"