js原型链(2)

xiaoxiao2021-02-28  56

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 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)); //true console.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() {} // 1 var f = new Fn(); console.log(f instanceof Fn); // true // 2 function Foo() {} // 修改 Fn.prototype 的指向 Fn.prototype = new Foo(); console.log(f instanceof Fn); // false // 3 var 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"

转载请注明原文地址: https://www.6miu.com/read-64427.html

最新回复(0)