js继承01

思路:

单例/工厂/构造函数--演进到原型
搞清原型结构 原型继承
模拟系统原型继承
实现自己的继承
观察原型继承特点

演进到原型链这一步


//单例模式: 防止变量名冲突:
// 思路: 本空间调用其他空间的方法-->本空间调用自己空间的方法
/*var utils = {
show: function () {
console.log('utils.show');
}
}; var search = {
show2: function () {
console.log('search.show2');
utils.show();
},
show3:function () {
this.show2();
}
}; search.show2();
// search.show2
// utils.show*/ //工厂模式: 节约了代码
/*function people(name, age) {
obj = {};
obj.name = name;
obj.age = age;
obj.show = function () {
console.log(this.name, this.age);
};
return obj;
} p1 = people("maotai",22);
p1.show();*/ //构造函数: 类属性和方法每个实例会有一份
/*
function people(name,age) {
this.name = name;
this.age = age;
this.show = function () {
console.log(this.name,this.age);
}
}
p1 = new people('maotai',22);
p1.show(); //maotai 22 p2 = new people('maomao',19);
p2.show(); //maomao 19
console.log(p1.show == p2.show); //false
*/ //原型模式: 实现方法共享
思路: 共有部分放到原型上(方法), 私有部分放到自己空间(属性)
/*
function people(name, age) {
this.name = name;
this.age = age;
} people.prototype.show = function () {
console.log(this.name, this.age);
}
p1 = new people('maotai', 22);
p1.show(); //maotai 22 p2 = new people('maomao', 19);
p2.show(); //maomao 19
console.log(p1.show == p2.show); //true <----------------比上一种优化点
*/

原型及圆形继承

- 知识前提
类属于function类型, 天生有prototype属性,指向一个对象(constructor[类本身]+__prototype)
实例属于object类型, 天生有__proto__属性,指向所属类的prototype function A() {
this.name = 'maotai' //name属于类A的私有属性
}
A.prototype.show = function () { //方法为了实例间公用,都放在prototype上.
console.log(this);
}; - 原型继承: 将B的prototype指向new A. - 模拟系统原型继承
function myObject() { }; function myEventTarget() { }; myEventTarget.prototype = new myObject;
myEventTarget.prototype.addListener = function () { }; function myNode() { } myNode.prototype = new myEventTarget;
myNode.prototype.createElement = function () { }; var n = new myNode;
console.dir(n);
1,原型链继承特点
1,将B将A的私有属性继承了, 当作了B的共有属性
2,原型继承是索引的执行, 并非属性的添加. 和父子之间基因继承不一样, 病不是把A类的属性和方法克隆一份给B,而是让B和A之间增加原型链的链接.
- 实现自己的原型继承: 下面有内存图

    function A() {
this.name = 'maotai'
} function B() {
this.name = 'maomao'
} B.prototype = new A; var n = new B;
console.dir(n);

构造函数中的细节知识点

- 构造函数中的细节知识点

js中的函数3种角色:

普通函数
对象 思路: 原型类和实例化写法 -- 类中this的2种情况 function Fn() {
this.name = 'maomao';
this.getName = function () {
console.log(this.name);
console.log(this);
}
} var f = new Fn;
f.getName();//方法中this是f
var ss = f.getName;
ss(); //方法中this是window 1.如果无参,Fn()省掉(),写成 Fn
2.this当前类的实例
- 思路: 搞函数局部变量和类属性区别(各自独立,没啥关系).
function fn = (){num=10;this.x = 100;}
f1 = new fn();
f1.num //undefined 函数执行3步骤(开辟私有作用域):
1, 形参赋值
2, 预解释
3, 代码从上到下执行
- 类中自定义返回值,将类默认返回覆盖了.

    function Fn() {
this.name = 'maomao';
this.getName = function () {
console.log(this.name);
console.log(this);
return {'name':'ssssssss'}
}
} var f = new Fn; //f变为{'name':'ssssssss'}
//检测数据类型
思路: 实例属于类 -- 检测是否为f1的属性 -- 检测是否为f1的私有属性 -- 检测是否为f1的共有属性 typeof //缺点: 只能检测到object类
arr instanceof Array //优点: 检测某个实例是否属于类,可以检测是object的arr?number 'name' in f1 //name是f1的一个属性
f1.hasOwnProperty('name') // 检测私有属性 function Fn() {
this.name = 'maotai';
};
Fn.prototype.age = 22;
Fn.prototype.getName = function () {
console.log(this.name);
}
var f1 = new Fn;
//f1是Fn的实例
console.log(f1 instanceof Fn); //true
//f1有属性age
console.log('age' in f1); //true //f1有私有属性name
console.log(f1.hasOwnProperty('name'));//true //自己实现: f1的共有属性
function hasPubProperty(obj,att) {
return (att in obj) && !obj.hasOwnProperty(att);
};
console.log(hasPubProperty(f1, 'age')); //true
- 构造函数中的细节知识点

js中的函数3种角色:

普通函数
对象 思路: 原型类和实例化写法 -- 类中this的2种情况 function Fn() {
this.name = 'maomao';
this.getName = function () {
console.log(this.name);
console.log(this);
}
} var f = new Fn;
f.getName();//方法中this是f
var ss = f.getName;
ss(); //方法中this是window 1.如果无参,Fn()省掉(),写成 Fn
2.this当前类的实例
- 思路: 搞函数局部变量和类属性区别(各自独立,没啥关系).
function fn = (){num=10;this.x = 100;}
f1 = new fn();
f1.num //undefined 函数执行3步骤(开辟私有作用域):
1, 形参赋值
2, 预解释
3, 代码从上到下执行
- 类中自定义返回值,将类默认返回覆盖了.

    function Fn() {
this.name = 'maomao';
this.getName = function () {
console.log(this.name);
console.log(this);
return {'name':'ssssssss'}
}
} var f = new Fn; //f变为{'name':'ssssssss'}
//检测数据类型
思路: 实例属于类 -- 检测是否为f1的属性 -- 检测是否为f1的私有属性 -- 检测是否为f1的共有属性 typeof //缺点: 只能检测到object类
arr instanceof Array //优点: 检测某个实例是否属于类,可以检测是object的arr?number 'name' in f1 //name是f1的一个属性
f1.hasOwnProperty('name') // 检测私有属性 function Fn() {
this.name = 'maotai';
};
Fn.prototype.age = 22;
Fn.prototype.getName = function () {
console.log(this.name);
}
var f1 = new Fn;
//f1是Fn的实例
console.log(f1 instanceof Fn); //true
//f1有属性age
console.log('age' in f1); //true //f1有私有属性name
console.log(f1.hasOwnProperty('name'));//true //自己实现: f1的共有属性
function hasPubProperty(obj,att) {
return (att in obj) && !obj.hasOwnProperty(att);
};
console.log(hasPubProperty(f1, 'age')); //true
原型扩展
1.重新赋值,导致constructor指向object,需要恢复
2.确定this是谁的顺序 function Fn() {
this.x = 100;
this.y = 200;
this.getX = function(){
console.log(this.x);
}
}; Fn.prototype = {
constructor: Fn,
y: 300,
getX: function () {
console.log(this.x);
},
getY: function () {
console.log(this.y);
}
}; var f = new Fn;
f.getX(); //100 1,this是f, 2.f.x 在私有里有,所以100
f.__proto__.getX(); //300 1.this是f.__proto__, console.log(f.__proto__),忽略私有,直接去原型上找, 无, 去object找,无,undefined Fn.prototype.getX(); //undefined f.getY(); //200
f.__proto__.getY();// 300
// 1.先确定this是谁
// 2.把this替换为对应的代码
// 3.按照原型链查找顺序

这里为何纠结this?  可以引出数组的链式写法.

    //执行原型上方法的3种方式
Array.prototype.myUnique=function () { }
Array.prototype.myUnique();
var arr = [];
arr.myUnique();
arr.__proto__.myUnique();
    var ary = [12, 23, 34, 12, 23, 34, 12, 23, 34, 12, 23, 34, 12, 23, 34];//->Array ->Object

    //->内置方法的链式写法:执行完成上一个方法,返回的结果依然是当前类的实例,这样就可以继续执行下一个方法了
// ary.sort(function (a, b) {
// return a - b;
// }).reverse().pop().push(100);
// console.log(ary); //->给方法起名字的时候加一个自己的前缀myXxx,防止把内置的方法覆盖掉
Array.prototype.myDistinct = function myDistinct() {
//this->ary:我们要去重的那个数组
var obj = {};
for (var i = 0; i < this.length; i++) {
var cur = this[i];
if (obj[cur] == cur) {
this[i] = this[this.length - 1];
this.length--;
i--;
continue;
}
obj[cur] = cur;
}
obj = null;
return this;//->实现链式写法
}; ary.myDistinct().push(100);
console.log(ary);

函数的3种角色

继承和核心:

所有类都是函数数据类型的一个实例

    //1、函数在整个JS中是最特殊的也是最重要的也是最难的
//->在JS中我们的函数有三种角色: //普通的函数(优先级最高的角色):因为它可以执行形成私有的作用域->形参赋值(arguments)->预解释->代码执行(return)->作用域的销毁或者不销毁... fn instanceof Function ->true //类:new执行,创建出自己的实例,有自己的原型,函数体中的this.xxx=xxx中的this是当前类的实例... //普通的对象:和var obj;中的obj一样,就是个对象名,有自己的属性... fn instanceof Object ->true //->函数的三种角色让其具有了多面性,但是每一种角色和其他的角色都是互不影响的 //2、Function函数类
//->每一个函数数据类型都是Function这个类的一个实例

json数据绑定 浏览器回流,重绘



[js]js中原型的继承的更多相关文章

  1. JS中原型链继承

    当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型, ...

  2. JS面向对象,原型,继承

    ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript ...

  3. 从零开始的全栈工程师——JS面向对象( 原型 this 继承)

    一.生成对象的方式 ①单例模式(字面量定义)var obj = {} ②类的实例 var obj = new Object( ) ③工厂模式 ④构造函数:扮演三种角色 普通函数 普通对象 类 工厂模式 ...

  4. JavaScript学习(二)——深入学习js对象的原型与继承

    了解对象  什么是对象?   …… 这个就不说了 对象的声明的两种方式 var person = new Object(); person.name="linchen"; pers ...

  5. javascript中继承(一)-----原型链继承的个人理解

    [寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...

  6. js中的原型、继承的一些想法

    最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...

  7. js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。

    js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } Class ...

  8. js继承之组合继承(结合原型链继承 和 借用构造函数继承)

    在我的前两篇文章中,我们已经介绍了 js 中实现继承的两种模式:原型链继承和借用构造函数继承.这两种模式都存在各自的缺点,所以,我们考虑是否能将这二者结合到一起,从而发挥二者之长.即在继承过程中,既可 ...

  9. js原型链+继承 浅析

    名称:    prototype--原型对象    __proto__--属性 原型链与继承网上搜索定义,看起来挺绕的 .先说继承: 所有的对象实例都可以共享原型对象包含的属性和方法  例如一个实例A ...

随机推荐

  1. WP8.1学习系列(第十章)——中心控件Hub设计指南

    Windows Phone 应用商店应用中的中心控件指南   在本文中 说明 示例 用法指南 设计指南 相关主题 重要的 API Hub (XAML) HubSection (XAML) 说明 中心控 ...

  2. css3整理--word-wrap/word-break/white-space

    word-wrap语法: word-wrap : normal | break-word normal : 默认值,单词如果单词超长,会冲出边界(单个单词超长,在当前行显示) break-word : ...

  3. python编程中的if __name__ == 'main': 的作用和原理

    在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个pyth ...

  4. sencha touch NavigationView 源码详解(注释)

    Ext.define('Ext.navigation.View', { extend: 'Ext.Container', alternateClassName: 'Ext.NavigationView ...

  5. JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  6. Installed .NET Framework 4.5 Ajax POST IIS hang

    去年我已写过一篇关于安装.NET Framework 4.5后特定场景Ajax POST的挂起问题 => http://www.cnblogs.com/junchu25/archive/2012 ...

  7. 安装 SQL SERVER MsiGetProductInfo 无法检索 Product Code 1605错误 解决方案

    重装数据库服务器上的SQL SERVER 2008 上遇到了以下问题 标题: SQL Server 安装程序失败. SQL Server 安装程序遇到以下错误: MsiGetProductInfo 无 ...

  8. 【CF802L】Send the Fool Further! (hard) 高斯消元

    [CF802L]Send the Fool Further! (hard) 题意:给你一棵n个节点的树,每条边有长度,从1号点开始,每次随机选择一个相邻的点走,走到一个叶子时就停止,问期望走的总路程. ...

  9. python中的null值

    在一个没有接口文档的自动化测试中,只能通过抓包及查日志查看发送的信息,其中有一个接口发送的信息如下: enable_snapshot": true, "new_size" ...

  10. Unity3D之游戏架构脚本该如何来写

    这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友 ...