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 继承 o1 for ( var k in o1 ) { o2[k] = o1[k]; } // 如果希望 o2 可以继承自任意的对象. 所以为了简化继承的代码 // 给 o2 提供一个方法, 叫 extend o2.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 -> null var 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 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"