相思资源网 Design By www.200059.com
这一语言功能的本质依赖于 JavaScript 特有的原型链(prototype chain)模式。
所以严格意义上说,JavaScript 是基于原型的面向对象语言。也就是说,每个实例对象都具有一个原型。对象从该原型中继承属性和方法。
1、构造函数
利用构造函数,可以简单地创建对象。构造函数内的 this 关键字指向实例对象本身:
复制代码 代码如下:
function People(name){
this.name = name;
}
使用 new 运算符和构造函数创建实例对象:
复制代码 代码如下:
var people = new People('小明');
console.log(people.name); //小明
但如果创建了两个实例,这两个实例之间无法直接共享属性和方法:
复制代码 代码如下:
var people1 = new People('小明');
var people2 = new People('小王');
people1.sex = 'male';
console.log(people2.sex); //undefined
也就是说对象一旦被实例化,其属性方法都独立存在,对某个属性的修改不会影响到其他实例。
2、Prototype
于是就有了 prototype 属性,这个属性是在生成实例对象时自动创建的。它本身又是一个对象,拥有能够在实例间共享的属性和方法。而实例本身的属性和方法,则包含在构造函数中。换句话说,构造函数内部的属性和方法,在经过实例化后都成为了本地的属性和方法,而原型(prototype)中的属性和方法在实例中只是一种引用,因此能够被多个实例共享。
还是刚才那个构造函数,现在为它增加 prototype 属性:
复制代码 代码如下:
People.prototype.sex = 'female';
//或者写成 People.prototype = {sex: 'female'};
console.log(people1.sex); //male
console.log(people2.sex); //female
People 构造函数的 prototype 属性参数会直接影响到 people1 和 people2 两个实例。
但为什么 people1.sex 输出 male 呢?这是由于在 JavaScript 中,原型关系以递归形式存在。对象的原型也是一个对象,而原型的本身也可能具有一个原型。原型的最高层级是全局的 Object 对象。
这就是说,一旦 people1.sex 被设置为 male 后,它在原型中对应的值就无法被暴露出来。假如 people1.sex 本身没有值,才会从构造函数的 prototype 属性中读取,以此类推一级一级向上查找,直到 Object 对象。
注:使用 “null” 给对象赋值,可以销毁自定义对象,释放内存资源。
所以严格意义上说,JavaScript 是基于原型的面向对象语言。也就是说,每个实例对象都具有一个原型。对象从该原型中继承属性和方法。
1、构造函数
利用构造函数,可以简单地创建对象。构造函数内的 this 关键字指向实例对象本身:
复制代码 代码如下:
function People(name){
this.name = name;
}
使用 new 运算符和构造函数创建实例对象:
复制代码 代码如下:
var people = new People('小明');
console.log(people.name); //小明
但如果创建了两个实例,这两个实例之间无法直接共享属性和方法:
复制代码 代码如下:
var people1 = new People('小明');
var people2 = new People('小王');
people1.sex = 'male';
console.log(people2.sex); //undefined
也就是说对象一旦被实例化,其属性方法都独立存在,对某个属性的修改不会影响到其他实例。
2、Prototype
于是就有了 prototype 属性,这个属性是在生成实例对象时自动创建的。它本身又是一个对象,拥有能够在实例间共享的属性和方法。而实例本身的属性和方法,则包含在构造函数中。换句话说,构造函数内部的属性和方法,在经过实例化后都成为了本地的属性和方法,而原型(prototype)中的属性和方法在实例中只是一种引用,因此能够被多个实例共享。
还是刚才那个构造函数,现在为它增加 prototype 属性:
复制代码 代码如下:
People.prototype.sex = 'female';
//或者写成 People.prototype = {sex: 'female'};
console.log(people1.sex); //male
console.log(people2.sex); //female
People 构造函数的 prototype 属性参数会直接影响到 people1 和 people2 两个实例。
但为什么 people1.sex 输出 male 呢?这是由于在 JavaScript 中,原型关系以递归形式存在。对象的原型也是一个对象,而原型的本身也可能具有一个原型。原型的最高层级是全局的 Object 对象。
这就是说,一旦 people1.sex 被设置为 male 后,它在原型中对应的值就无法被暴露出来。假如 people1.sex 本身没有值,才会从构造函数的 prototype 属性中读取,以此类推一级一级向上查找,直到 Object 对象。
注:使用 “null” 给对象赋值,可以销毁自定义对象,释放内存资源。
标签:
原型继承,基础机制
相思资源网 Design By www.200059.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
相思资源网 Design By www.200059.com
暂无JavaScript原型继承之基础机制分析的评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?