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
语法:
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
规律:
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"
- js原型链(2)
- JS(原型链)
- js原型(2)
- JS原型、原型链
- JS-原型、原型链
- JS原型,原型链
- js原型,原型链
- JS原型+原型链
- JS原型链(补)
- JS原型链(3)
- JS原型和原型链
- JS原型和原型链
- JS原型和原型链
- JS原型和原型链
- js 原型和原型链
- JS 原型与原型链
- JS原型和原型链
- js原型与原型链
- #5 计算属性与数据集合
- 【XML】SAX解析XML
- 混入Assasin的海盗分金问题
- C语言程序设计(39)
- 关于水仙花数
- js原型链(2)
- 连连看(外观较简陋)
- 第41章 离散时间信号与系统 z 域分析
- PAT-A-1087. All Roads Lead to Rome (30)
- 敏捷开发,QA面临的10个挑战
- 从源码角度带你分析 Android View 事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程
- 深入 char * ,char ** ,char a[ ] ,char *a[] 内核
- strom 分布式的实时计算系统
- shader开始之旅