JavaScript 之 面向对象 [ 原型 ]
原型
描述
- 所有函数(Function类型)都具有的属性
- 在函数进行定义时,就包含prototype属性
- prototype属性的默认值为一个空对象 {}
获取原型
第一种
- 构造函数的prototype属性
第二种
- Object对象提供的getPrototypeOf()方法
function fun() {console.log( '啊哈哈' );
}
/* 所有函数都具有prototype属性,可以直接调用 */
console.log( fun.prototype );// 显示 fun {}
/*Function类型包含 构造函数* 所有引用类型都可以使用 构造函数方式定义 - 所有引用类型都是构造函数* 构造函数也可以用来定义对象(Object类型) - Object也可以调用prototype属性*/
/* 引用类型调用prototype属性 */
console.log( String.prototype );// 显示 [String: '']
/* Object调用prototype属性 */
console.log( Object.prototype );// 显示 {}/*获取原型* 可以通过以下两种方法获取指定目标的原型* 第一种* 构造函数的prototype属性* 第二种* Object对象提供的getPrototypeOf()方法*//* 定义一个函数 */
function fn() {console.log( '呕呀呀' );
}
/* 通过prototype属性获取 */
console.log( fn.prototype );// 显示 fn {}
/* 通过getPrototypeOf()方法获取 */
console.log( Object.getPrototypeOf( fn ) );// 显示 [Function]
原型新增属性或方法
- 获取的原型会得到一个空对象
- 是对象就有属性或方法
- 也可以新增属性或方法
新增方式
第一种方式
- 构造函数.prototype.属性名(方法名) = 属性值(方法体)
/* 定义一个函数 */
function fun() {console.log( 100 );
}/* 第一种方式 */
/* 获取原型 */
console.log( fun.prototype );// 显示 fun {}
/* 为原型添加属性或方法 */
fun.prototype.name = '唐三';
/* 才重新获取原型 */
console.log( fun.prototype );// 显示 fun { name: '唐三' }
第二种方式
- Object.defineProperty( 获取原型,属性名(方法名),{ 属性描述符 } )
/* 定义一个函数 */
function fun() {console.log( 100 );
}
/* 第二种方式 */
/* 获取原型 */
console.log( fun.prototype );// 显示 fun { name: '唐三' }
/* 为原型添加属性或方法 */
Object.defineProperty( fun.prototype, 'nian', {/* 设置属性值或方法体 */value : 20,/*设置是否可枚举* 用于打印对象时可以正常显示新增的属性* 不设置可枚举时将无法显示新增属性,只显示原有属性* 显示 fun { name: '唐三' }*/enumerable : true
} );
/* 才重新获取原型 */
console.log( fun.prototype );// 显示 fun { name: '唐三', nian: 20 }
自有属性和原型属性
自有属性
- 构造函数(对象)本身自带或添加的属性
原型属性
- 从原型中获得属性
/* 定义一个构造函数 */
function Fun() {/* 设置自有属性和方法 */this.name = '唐三';this.menpai = function () {console.log( '唐门' );}
}
/* 获取原型 */
console.log( Fun.prototype );//Fun {}
/* 为原型添加新属性 - 原型属性 */
Fun.prototype.nian = 20;
/* 在获取原型 */
console.log( Fun.prototype );//Fun { nian: 20 }/*通过构造函数Fun创建对象* 该对象具有构造函数Fun的自有属性* 该对象也具有构造函数Fun的原型属性*/
/* 创建对象 */
var fn = new Fun();
/* 调用自有属性 */
console.log( fn.name );// 显示 唐三
/* 调用原型属性 */
console.log( fn.nian );// 显示 20/* 使用相同的构造函数在创建一个对象 */
var fu = new Fun();
/* 新对象对自有属性进行修改 */
fu.name = '融念冰';
/* 调用修改的自有属性 */
console.log( fu.name );// 显示 融念冰
/* 两个对象之间不会有影响 */
console.log( fn.name );// 显示 唐三/* 修改原型属性 */
Fun.prototype.nian = 25;
/* 以构造函数Fun创建的对象都会被修改 */
console.log( fn.nian );// 显示 25
console.log( fu.nian );// 显示 25
重写属性
- 表示在自有属性和原型属性同名时,自有属性会覆盖原型属性
/* 定义一个构造函数 */
function Fun() {/* 自有属性 */this.name = '唐三';
}
/* 获取原型并添加原型属性 */
Fun.prototype.name = '融念冰';/* 创建一个对象 */
var fn = new Fun();
/* 调用属性 */
console.log( fn.name );// 显示 唐三(自身属性)
删除属性
- 通过delete关键字来进行删除
- 如果进行删除的目标对象同时具有自有属性和原型属性,会先删除自有属性
/* 定义一个构造函数 */
function Fun() {/* 自有属性 */this.name = '唐三';
}
/* 获取原型并添加原型属性 */
Fun.prototype.name = '融念冰';/* 创建一个对象 */
var fn = new Fun();
/* 调用属性 */
console.log( fn.name );// 显示 唐三(自身属性)/*删除属性* 通过delete关键字来进行删除* 如果进行删除的目标对象同时具有自有属性和原型属性,会先删除自有属性*/
/* 删除目标对象的指定属性 */
delete fn.name;// 优先删除自有属性
/* 在调用已删除的属性 */
console.log( fn.name );// 显示 融念冰(原型属性)
检测属性
- 表示检测目标对象中,是否存在指定属性
Object.hasOwnProperty()方法
Object.hasOwnProperty( 指定属性名称 )方法
- 用于判断当前指定属性是否为自有属性
- true - 表示存在
- false - 表示不存在
/* 定义一个构造函数 */
function Fun() {/* 自有属性 */this.name = '唐三';
}
/* 原型属性 */
Fun.prototype.name = '融念冰';
/* 创建对象 */
var fn = new Fun();/* Object.hasOwnProperty()方法 */
console.log( fn.hasOwnProperty( 'name') );// 显示 true
in 关键字
in 关键字 - (属性名 in 对象名)
- 用于判断对象中是否存在指定属性(自有属性或原型属性)
- true - 表示存在
- false - 表示不存在
/* 定义一个构造函数 */
function Fun() {/* 自有属性 */this.name = '唐三';
}
/* 原型属性 */
Fun.prototype.name = '融念冰';
/* 创建对象 */
var fn = new Fun();
/* in 关键字 */
console.log( 'name' in fn );// 显示 true
显示原型和隐式原型
显示原型
- 所有函数的原型(prototype)都可以称为是显示原型
隐式原型
- 所有对象的原型(__proto__)都可以称为是隐式原型
/* 定义一个构造函数 */
function Fun() {/* 自有属性 */this.name = '唐三';
}
/* 原型属性 */
Fun.prototype.nian = 20;
/* 创建对象 */
var fn = new Fun();/* 调用自有属性 */
console.log( fn.name );// 显示 唐三
/* 调用原型属性 */
console.log( fn.nian );// 显示 20/* 对象调用函数的原型 */
console.log( fn.prototype );// 显示 undefined 对象会将prototype,当做自身的属性进行调用
/* 对象调用对象的原型 */
console.log( fn.__proto__ );// 显示 Fun { nian: 20 }
isPrototypeOf()方法
表示用于判断一个指定对象是否为另一个目标对象的原型
- true - 表示 是
- false - 表示 不是
/* 定义一个对象 */
var obj = {name : '唐三'
}
/* 定义一个构造函数 */
function Fun() {}
/* 将指定对象赋值给构造函数Fun的原型 */
Fun.prototype = obj;
/* 创建对象 */
var fn = new Fun();/* 判断obj对象是否为fn对象的原型 */
console.log( obj.isPrototypeOf( fn) );// 显示 true
JavaScript 之 面向对象 [ 原型 ]相关推荐
- JavaScript的面向对象--原型
在以类为中心的面向对象编程语言中,类和对象的关系可以想象成铸模和铸件的关系,对象总是从类中创建而来.而在原型编程的思想中,类并不是必需的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象所得 ...
- JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)
4.原型 每个函数都有一个prototype属性,这个属性是一个对象,用途是包含可以由特定类型的所有实例共享的属性和方法. 逻辑上可以这么理解:prototype通过调用构造函数而创建的那个对象的原型 ...
- JavaScript为什么使用原型模式而不是类模式
导言: 作为JavaScript初学者的本菜鸡而言,刚一开始接触这门语言我就被他的原型模式给吓到了.并且在相当长的一段时间之内,我都完全不能理解或者不能接受这个模式.直到最近经过多方调查和思考才有所明 ...
- JavaScript对象、原型、原型链知识总结思维导图
这个思维导图是我对Object,原型,原型链等知识的总结,主要参考高程一书第六章,写完才发现这么多,以后可能会进行精简.内容可能会出现差错,欢迎批评指正.下载==>Github ECMAScri ...
- 对Javascript 类、原型链、继承的理解
一.序言 和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- javascript 中面向对象实现 如何继承
上一篇博客已经说了关于javascript中的封装, 其中也说了javascript中本来是没有类的,我们上一篇的封装也是用javascript中的函数去模拟一个类,最后我们还模拟了一个构造函数.那 ...
- JavaScript 使用面向对象的技术创建高级 Web 应用程序
最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...
最新文章
- JButton 圆角_ProE、Creo在玩具轿车设计中的一个案例应用解析|轿车|玩具|圆角
- 通过“远程桌面连接”连接到Ubuntu
- 【干货】分库分表最佳实践
- go 学习Printf
- javascript --- typeof方法和instanceof方法
- 初学C#中遇到的问题!
- 从入门到退坑,详解数分行业的3个岗位,起薪高达40W的是哪个?
- ReactJS入门学习一
- linux安装pdo mysql扩展_linux下php安装pdo_mysql扩展
- 网站测试自动化系统—在测试代码中硬编码测试数据
- 内存颗粒的逻辑bank理解
- C++ Primer 第三版电子版PDF
- 在python中datetime使用中如何识别上月同期日期
- matlab两个单引号是什么意思,两个单引号什么时候用
- 1063 Set Similarity (25 分) java 题解
- 微软Project Europe或将帮助Win10应用开发
- z变换判断稳定性和因果性_判断因果性.PPT
- DDR3学习总结(二)
- 物理建模钢琴-Modartt Pianoteq Pro v6.7.0 WiN
- Prometheus监控系统