原型与原型链

43次阅读

共计 706 个字符,预计需要花费 2 分钟才能阅读完成。

一、构造函数

构造函数是一个普通函数,创建方式与普通函数没有区别,不同的是构造函数习惯首字母大写。另外,调用方式不同,普通函数直接调用,构造函数则是通过 new 关键字调用。

每创建一个 Person 构造函数,在 Person 构造函数中,为每一个对象都添加了一个 sayName 方法,也就是说构造函数每执行一次就会创建一个新的 sayName 方法。这样就导致了构造函数执行一次就会创建一个新的方法,执行 10000 次就会创建 10000 个新的方法,而 10000 个方法都是一摸一样的,为什么不把这个方法单独放到一个地方,并让所有的实例都可以访问到呢? 这就需要原型 (prototype)。

二、原型

在 javascript 中,每一个函数数据类型都天生自带一个 prototype 属性,这个属性指向了函数原型对象,并且这个属性是一个对象数据类型的值。原型的属性或方法会被原型实例所共享。通过原型创建的原型实例是独立的。

三、原型链

1.__proto__和 constructor

每一个对象数据类型(普通对象、实例、prototype)也天生自带一个属性__proto__,属性值是当前实例所属类的原型(prototype)。原型对象中有一个属性 constructor,它指向函数对象。

2. 何为原型链

万物皆对象,对象之间的继承关系,是通过 prototype 对象指向父类对象,直到指向 Object 对象为止,这样就形成了原型链。

当我们访问对象的一个属性或方法时,它会先在对象自身查找,如果有则直接使用,如果没有就会去原型对象中查找,如果找到就直接使用。如果没有就去原型的原型中查找,找到为止。如果在 Object 原型中还没有找到,就返回 undefined。

正文完
 0

原型与原型链

43次阅读

共计 844 个字符,预计需要花费 3 分钟才能阅读完成。

var n = new Number(1);
var s = new String(‘hi’);
var b = new Boolean(true);
var o = new Object();
因为每个地址里都会存在 toString 和 valueOf 这样会造成内存浪费所以要使用 Object 公用属性 来节省空间
var o1 = new Object();

原型(共有属性)
语法:var 对象 = new 函数 (); 对象.__proto__ === 函数.prototypevar obj = 函数.prototype 函数.prototype.__proto__ === object.prototype
//Obiect 的共有属性是 Object.prototype
var o1 = {};
o1.__proto__ === Object.prototype; //true

//Number 的共有属性是 Object.prototype
var n1 = new.Number(1);
n1.__proto__ === Number.prototype; //true
n1.__proto__.__proto__ === Object.prototype //true

//String 的共有属性
var s1 === new String(‘1’);
s1.__proto__ === String.prototype; //true
s1.__proto__.__proto__ === Object.prototype; //true

//Boolean 的共有属性
var b1 = new Boolean(true);
b1.__proto__ === Boolean.prototype; //true
b1.__proto__.__proto__ === Boolean.prototype; //true

proto 和 prototype 的区别是什么?
proto 是对象的属性 prototype 是函数的属性
无代码状态 浏览器会先把代码初始好 String.prototype 是 String 的共用属性的引用 s.__proto__ 是 string 的共用属性的引用

正文完
 0