var obj;for(var i=0; i<10; i++){ obj = {};}再比如下面代码,永远不可能相等console.log([] == []); // falseconsole.log({} == {}); // falseconsole.log(function(){} == function(){}); // false对于引用类型,==和===都是比较内存地址那么构造函数function Person(name,age,gender){ this.name = name; this.age = age; this.gender = gender; this.sayHello = function() {};}var p1 = new Person('jim',19, '男');var p2 = new Person('jack',20, '男');在内存中会有两个sayHello副本,但逻辑一模一样,浪费资源需要将像方法这些可以共享的数据单独存储起来,让每个对象都可以在方法上得到共享。因此引入一个特殊的对象,以存储共享数据,然后每个对象都可以直接使用共享的数据。(2)什么是原型?原型只是一个很普通的对象,但它专门给一些对象存储共享的数据,所以给它取一个名字,叫原型。(3)原型的结构?① 凡是写一个函数的时候,内部就会自动创建一个对象,该对象使用 函数.PRototype 来访问;② 该对象只包含一个数据,即 constructor 属性,用于描述该对象对应的函数;③ 该对象有一个使用特征:如果将函数作为构造函数来使用,创建出来的对象默认连接到该特殊对象中;(所谓连接到特殊对象,是指特殊对象中的成员,可以直接被该构造函数创建出来的对象所使用)这个特殊对象就是原型(原来的/原始的形态/模型)。(4)补充一些概念(依照面向对象语言):
概念词 | 作用 | 称为 |
构造函数constructor | 用来描述对象应该具有什么成员使用 | 类 class |
属性 property | 用于表示对象的特征数据 | 字段 field |
方法 method | 用于描述对象的行为 | 函数 function |
构造函数创建的对象 | 称为该构造函数(该类)的实例,将这个过程称为实例化 | 实例instance |
// 给原型添加属性的例子function Person(){}Person.prototype.type = 'Person';var p = new Person();p.type; // 'Person'(1)直接利用对象的动态特性添加成员构造函数.prototype.XXX = xxx;(2)利用直接替换原型对象的方法构造函数.prototype = { constructor: 构造函数, XXX1: xxx1, XXX2: xxx2, XXX3: xxx3, ...}//原来的原型就被丢弃掉了在利用替换法使用原型的时候,容易出现的问题:实例在被创建的那一刻它的原型就被固定了。
新闻热点
疑难解答