一、理解什么是对象:
任何东西都可以是对象,对象就是一组无序属性的集合 对象具有属性和方法
1.1 属性的类型
属性内部又定义了两种属性:数据属性和访问器属性

(1)数据属性:有4个描述的行为

Configurable 表示是否可以通过delate删除属性
Enumerable 表示是否可以通过for-in循环返回属性
Writable 表示是否修改属性的值
Value 表示这个属性的数据值

 

想要访问这些行为就需要用到Object.defineProtoperty()这个方法,参数是对象 属性名 {行为:值}
注意:如果一旦设置为false也就是不可配置之后,就不能配置成可配置的了(除了:writeable)虽然ie8能实现这个方法,但是实现不彻底(只能在DOM对象上使用,只能创建访问器属性),所以不要在ie8使用

(2)访问器属性

Configurable 是否通过delate删除
Enumerable 是否通过for-in循环
Get  读取属性调用的函数
Set 写入属性调用的函数

 

同样需要通过Object.definePrototype() 参数也是一样的 如果是get和set就是值需要写成函数。
这里有两个非标准的获取和写入属性的函数:_definefineGetter_()和_defineSetter_()这两个可以只用用对象.方法(‘属性’,functon(){return this.属性})

1.2、定义多个属性

Object.defineProperties() 参数:对象 {属性:{行为:值}}

1.3、获取属性的特性

利用上面两个方法设置好属性的特性之后,就可以用Obecjt.getOwnPropertyDescriptor()获取到属性的行为
Obecjt.getOwnPropertyDescriptor() 参数 对象 属性名,获取到的是这个属性的所有的行为的json类型

二、创建对象
2.1、工厂模式

function person(name,age){
var o=new Oject();
o.name=name;
o.age=age;
o.getname=function(){
alert(this.name)
}
return o;
}
var person1=person(1,2)

这里面是类似一个公共的函数,每次调用这个函数传入对应的值。这样省了每次都要写相同的代码  问题是:这样不能知道一个对象的类型

2.2、构造函数模式

function Person(name,age){
this.name=name;
this.age=age;
this.getname=function(){
alert(this.name)
}
}
var person1=new Person(1,2)

这里面new的作用是:1.一个新的对象 2.将this指向这个新的对象 3.给这个新的对象添加属性
constructor判断对象的都构造函数,instanceof判断对象的类型

问题:person1里面有个function function也是一个对象,在某种意义上来说每次new一个实例的的时候也是new了一个function,这样的话每个实例都有一个不同的function实例
解决:将this.getname=getname然后再构造函数外部写一个getname的函数,这样每个实例都指向的是全局的getname,问题:像上面这样解决,就会造成可能出现很多的全局函数

2.3、原型模式
理解原型 实例 构造函数的关系

原型:每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象 就是原型对象
实例:就new 构造函数出来的,实例有一个内部的_proto_指针指向原型对象
注意:判断实例是否等于某个原型对象 用isPrototypeof这个方法Person.prototype.isPrototypePf(person1),获取某个对象的原型 Object.getPrototypeof()如果一个实例重写了一个属性的值,那么访问这个属性的时候,显示在实例找,没有的话,在找原型

判断属性存放在原型还是实例?
hasOwnProperty检测属性是否来自于实例,只有属性来自实例,才会返回true,in只要通过能够访问的属性就返回true,这两个结合可以确定属性是在原型还是在实例

2.4、组合会用构造函数和原型模式

function Person(name,age,job){
this.name=name;
this.age=age;
this.friends=[1,2]
}
Person.prototype={
constructor:Person,//放在原型对象是为了重写默认的prototype对象的时候,constructor属性变成新的对象的constructor属性,而指向Object函数
sayname:function(){
alert(this.name)
}
}
var person1=new Person(1,2)

三、继承
原型链:继承(原生链)

function Parent(name){
this.name=name;
}
Parent.prototype.sayname=function(){
alert(this.name)
}
function Child(name,job){
Parent.call(this,name);//将父级的属性继承,避免子级重写父级属性
this.job=job
}
Child.prototype=new Parent();//继承
Child.prototype.constructor=Child;
Child.prototype.sayjob=function(){
alert(this.job)
}

javascript面向对象继承和原型的更多相关文章

  1. javaScript面向对象继承方法经典实现

    转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...

  2. JavaScript面向对象—继承的实现

    JavaScript面向对象-继承的实现 前言 面向对象的三大特性:封装.继承和多态.上一篇我们简单的了解了封装的过程,也就是把对象的属性和方法封装到一个函数中,这一篇讲一下JavaScript中继承 ...

  3. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

  4. JavaScript 面向对象继承详解

    题记 由于js不像java那样是完全面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,一般都是基于原型链的方式: 一.继承初探 大多数JavaScript的实现用 __proto_ ...

  5. JavaScript面向对象继承方法

    JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是JavaScript的类型非常松散,也没有编译器.这样一来 ...

  6. javascript 面向对象 new 关键字 原型链 构造函数

    JavaScript面向对象JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描述 ...

  7. JavaScript面向对象 实例与原型

    JavaScript 面向对象 和 C# 不太一样,js 的对象是继承自原型的如下: 首先创建一个 js 实例 new  function function f () {} 这个函数 会继承 Func ...

  8. Javascript之继承(原型链方式)

    1.原型链 原型链是JavaScript中继承的主要方法. 每个构造函数都拥有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),实例都包含一个指向原型对象的内部指针(__p ...

  9. javascript --- 只继承于原型

    正如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去. 如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了. 毕竟采用new her()方法将her的 ...

随机推荐

  1. C# EventHandler委托事件小结--百度

    最近遇到一个委托的问题,+=这个符号 this.Activated += new EventHandler(Form1_Activated);//Form1_Activated为方法名12 这个语句拆 ...

  2. cinder服务状态up/down的源码梳理

    基于ocata版本的,源码梳理 1)用户输入cinder service-list命令行,查看cinder服务的状态时,cinder的入口函数为cinder/api/contrib/services. ...

  3. sourcetree 不停的让输入密码,报 password required

    sourcetree 不停的让输入密码,报 password required sourcetree 不停的让输入密码,报 password required1.在终端(terminal)打开你的工程 ...

  4. 洛谷P2119 魔法阵

    P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...

  5. 根据T-Code查看用户出口的代码

    在此非常非常感谢源作者,这段代码真的非常非常有用好用! REPORT  YLBTEST. TABLES :  tstc,     "SAP Transaction Codes(SAP 事务代 ...

  6. Discuz!快速对接个人支付插件

    ## Discuz!快速对接个人支付插件 由于近期准备使用老牌论坛程序Discuz建立一个交流社区分享一些资源,但是测试了各种支付方式都不满意,偶然发现一个简直不要太完美的解决方案.今天抽时间搭建好并 ...

  7. CoinEye PRIVACY POLICY

    PRIVACY POLICY First, welcome to use the app Thank you for using our products and services ("Se ...

  8. js和css文件位置对页面性能的影响

    翻译了一篇Performance上的关于页面性能的文章<DecIPhering the critical rendering path>,原文在这里.需要进一步整理和了解有关js.css等 ...

  9. springboot 简单自定义starter - dubbo

    首先需要引入pom 这里使用nacos注册中心 所以引入了nacos-client 使用zookeeper注册中心的话需要引入其相应的client <dependency> <gro ...

  10. 转 rman-08120 以及查询隐含参数

    rman-08120 We need RMAN to automatically purge archivelogs from the FRA once they are applied to the ...