javascript

4.1变量,作用域
Javascript变量是松散类型的本质,决定了它只是在特定的时间用于保存特定的值而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变。
ECMAScript变量可能包含两种不同数据类型的值:
基本类型和引用类型
基本类型就是简单的数据段 (Undefined Null Number Boolean String )基本类型是按值访问的
引用类型是那些可能由多个值构成的对象(Object)引用类型实际上是在操作对象的引用,而不是实际的对象

区别
1复制变量值
1)基本类型:会在变量对象上创建一个新值,然后把改值复制到新变量
分配的位置上 互不影响 完全独立
2)引用类型:复制的是原来对象的指针,这个指针指向存储在堆中的一个对象。复制操作结束后实际上两个变量引用同一个对象。改变其一会影响另一个变量

4.1.4检测类型
基本数据类型的检测用typeof
引用类型的检测用instanceof

6.2创建对象
1.工厂模式

       function obj(name, age, job){
          var o = new Object();
          o.name = name;
          o.age = age;
          o.job = job;
          o.sayName = function(){
              alert(this.name);
          }
          return o;
      }

      var person1 = obj("Nike",28,"enginner")

2构造函数模式

function Person(name,age,job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.sayName = function(){
                alert(this.name)
            }
        }
        var person2 = new Person("Lucy",28,"enginner");

3原型模式

        function Person(){}
        Person.prototype.name = "Nike";
        Person.prototype.age = 28;
        Person.prototype.job = "Engineer";
        Person.sayName = function(){
            alert(this.name);
        }

4组合使用构造函数和原型

        function Person(name, age, job){
            this.name = name;
            this.age = age;
            this.job = job;
            this.friends = ["Nike","Lucy"]
        }
        Person.prototype = {
            constructor : Person,
            sayName : function(){
                alert(this.name);
            }
        }
        var person1 = new Person();
        var person2 = new Person();
        person2.friends.push("Lili");
        console.log(person2.friends)
        console.log(person1.friends)
        console.log(person2.friends === person1.friends)

5动态原型模式
有其他 OO 语言经验的开发人员在看到独立的构造函数和原型时,很可能会感到非常困惑。动态原
型模式正是致力于解决这个问题的一个方案,它把所有信息都封装在了构造函数中,而通过在构造函数
中初始化原型(仅在必要的情况下),又保持了同时使用构造函数和原型的优点。换句话说,可以通过
检查某个应该存在的方法是否有效,来决定是否需要初始化原型。来看一个例子

        function Person(name, age, job){
            this.name = name;
            this.age = age;
            this.job = job;
            if(typeof this.sayName != "function"){
                Person.prototype.sayName = function(){
                    alert(this.name);
            }    
          }
        }
        var fr = new Person("Bill",10,"student");

6寄生构造函数模式

function SpecialArray(){
            var value = new Array();
            value.push.apply(value, arguments);
            value.toPipedString = function(){
                return this.join("|");
            }
            return value;
        }
        var val = new SpecialArray("red","blue");
        console.log(val instanceof SpecialArray)

in 操作符 和 hasOwnProperty()
有两种方式使用 in 操作符:单独使用和在 for-in 循环中使用。在单独使用时,in 操作符会在通
过对象能够访问给定属性时返回 true,无论该属性存在于实例中还是原型中。
由于 in 操作符只要通过对象能够访问到属性就返回 true,hasOwnProperty()只在属性存在于
实例中时才返回 true

keys()
要取得对象上所有可枚举的实例属性,可以使用 ECMAScript 5 的 Object.keys()方法。这个方法
接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组

function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
 alert(this.name);
};
var keys = Object.keys(Person.prototype);
alert(keys); //"name,age,job,sayName"
var p1 = new Person();
p1.name = "Rob";
p1.age = 31;
var p1keys = Object.keys(p1);
alert(p1keys); //"name,age" 

****原型的动态性****
尽管可以随时为原型添加属性和方法,并且修改能够立即在所有对象实例中反映出来,但如果是重
写整个原型对象,那么情况就不一样了。我们知道,调用构造函数时会为实例添加一个指向最初原型的
[[Prototype]]指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
请记住:实例中的指针仅指向原型,而不指向构造函数

function Person(){
}
var friend = new Person();

Person.prototype = {
 constructor: Person,
 name : "Nicholas",
 age : 29,
 job : "Software Engineer",
 sayName : function () {
 alert(this.name);
 }
};
friend.sayName(); //error 
image.png

proto

继承是面向对象编程的最最基础的概念,本文主要讲解JS中继承的实现方式及原理。

将共享方法抽象到函数prototype中。

对于共享属性/方法,没必要每个对象都复制一份,只需要能引用到这个属性就可以了,而这与prototype的思路正好相同。

文章--关于面向对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 第5章 引用类型 引用类型的值(对象)是引用类型的一个示例。在ECMAScript 中,引用类型是一种数据结构,用...
    力气强阅读 673评论 0 0
  • 第十章 变量、作用域及内存 JavaScript的变量与其他语言的变量有很大区别。JavaScript变量是...
    上书房_张强阅读 391评论 0 2
  • 最近热播剧《我的前半生》教育了很多的女孩、女人。 一个女人若是笨到觉得男人会真的宠你爱你养你一辈子...
    圆圆芳芳阅读 265评论 0 3
  • 影子对着你来的方向我想问你是否让我心不再背光
    芸芸呐阅读 215评论 0 4
  • 熊大熊二家的亲戚带着娃去旅游,要把“土匪”寄养过来,征求小贝,玛丽意见的时候,玛丽一如既往地高冷,小贝高兴的“...
    喵小秋阅读 330评论 0 0