原型

描述

  • 所有函数(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 之 面向对象 [ 原型 ]相关推荐

  1. JavaScript的面向对象--原型

    在以类为中心的面向对象编程语言中,类和对象的关系可以想象成铸模和铸件的关系,对象总是从类中创建而来.而在原型编程的思想中,类并不是必需的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象所得 ...

  2. JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)

    4.原型 每个函数都有一个prototype属性,这个属性是一个对象,用途是包含可以由特定类型的所有实例共享的属性和方法. 逻辑上可以这么理解:prototype通过调用构造函数而创建的那个对象的原型 ...

  3. JavaScript为什么使用原型模式而不是类模式

    导言: 作为JavaScript初学者的本菜鸡而言,刚一开始接触这门语言我就被他的原型模式给吓到了.并且在相当长的一段时间之内,我都完全不能理解或者不能接受这个模式.直到最近经过多方调查和思考才有所明 ...

  4. JavaScript对象、原型、原型链知识总结思维导图

    这个思维导图是我对Object,原型,原型链等知识的总结,主要参考高程一书第六章,写完才发现这么多,以后可能会进行精简.内容可能会出现差错,欢迎批评指正.下载==>Github ECMAScri ...

  5. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

  6. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  7. JavaScript中的原型和继承

    请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...

  8. javascript 中面向对象实现 如何继承

    上一篇博客已经说了关于javascript中的封装, 其中也说了javascript中本来是没有类的,我们上一篇的封装也是用javascript中的函数去模拟一个类,最后我们还模拟了一个构造函数.那 ...

  9. JavaScript 使用面向对象的技术创建高级 Web 应用程序

    最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...

最新文章

  1. JButton 圆角_ProE、Creo在玩具轿车设计中的一个案例应用解析|轿车|玩具|圆角
  2. 通过“远程桌面连接”连接到Ubuntu
  3. 【干货】分库分表最佳实践
  4. go 学习Printf
  5. javascript --- typeof方法和instanceof方法
  6. 初学C#中遇到的问题!
  7. 从入门到退坑,详解数分行业的3个岗位,起薪高达40W的是哪个?
  8. ReactJS入门学习一
  9. linux安装pdo mysql扩展_linux下php安装pdo_mysql扩展
  10. 网站测试自动化系统—在测试代码中硬编码测试数据
  11. 内存颗粒的逻辑bank理解
  12. C++ Primer 第三版电子版PDF
  13. 在python中datetime使用中如何识别上月同期日期
  14. matlab两个单引号是什么意思,两个单引号什么时候用
  15. 1063 Set Similarity (25 分) java 题解
  16. 微软Project Europe或将帮助Win10应用开发
  17. z变换判断稳定性和因果性_判断因果性.PPT
  18. DDR3学习总结(二)
  19. 物理建模钢琴-Modartt Pianoteq Pro v6.7.0 WiN
  20. Prometheus监控系统

热门文章

  1. 十年生死轮回,看国产手机发展四个阶段
  2. 洛谷 P4549 【模板】裴蜀定理
  3. 微软CRM记录列表每页显示超过250个记录解决办法
  4. 一个有趣的IP不同的问题?
  5. JavaScript基础知识(三个判断、三个循环)
  6. PyQT5 helloworld教程(转载)
  7. scala helloworld
  8. Hibernate建立关系配置(hbm.xml)bag中cascade属性
  9. wordpress标签或者固定地址中文404错误解决插件
  10. iOS开发----UI部分----iPhone各类屏幕的分辨率