对象的创建

创建对象
1.工厂模式

//工厂模式,可以解决创建多个相似对象,无法识别对象是哪个类型
function createPerson(name,age,job) {
    var o = new Object();//显示的创建对象
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        console.log(o.name);
    }
    return o; //返回对象才能被外部引用
}
var person = createPerson("工厂",12,"doctor");
person.sayName();

2.构造函数模式

//构造函数类型
function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        console.log(this.name);
    }
}
//调用方式
//1.当构造函数来调用
var person1 = new Person("构造1",12,"doctor");//引用时new 创建对象,this指向了新对象
var person2 = new Person("构造person2",12,"doctor");//引用时new 创建对象,this指向了新对象
console.log(person1 instanceof Person);//true

//2.普通函数调用
Person("构造2",12,"doctor");//添加到window
Person("构造4",12,"doctor");//添加到window
window.sayName();//构造4

//3.在另一个函数的作用于中调用
var b = new Object();
Person.call(b,"构造3",12,"doctor");
b.sayName();//构造3

console.log(person1.sayName== person2.sayName ) //false  会创建两个做同样任务的函数实例
 //改进的构造函数类型
function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName =sayName; //将函数定义成全局函数,但该函数只能某个特定的对象来调用
}
function sayName(){
    console.log(this.name);
}

3.原型模式

//原型模式
function Original() {
    
}
Original.prototype.name = "Tom";
Original.prototype.age = 20;
Original.prototype.job = "Doctor";
Original.prototype.sayName = function () {
    console.log(this.name);
};

var or1 = new Original();
var or2 = new Original();

or1.name = "JOiny"; //重新定义实例属性,但不改变原型属性
console.log(or1.name);//JOiny 来自实例
console.log(or1.hasOwnProperty("name")); //true hasOwnProperty 是否有实例属性
console.log("name" in or1); //true  给定属性是否在对象中,,实例和原型中皆可
console.log(or2.name);//Tom 来自原型
delete or1.name;//delete 删除实例属性
console.log(or1.name);//

//原型模式2 重写了默认的prototype对象,prototype 不在指向Original2 而是指向Object对象
function Original2(){
}

Original2.prototype = {
    constructor : Person,
    name : "Nicholas",
    age : 29,
    job: "Software Engineer",
    sayName : function () {
        console.log(this.name);
    }
};

var friend = new Original2();

console.log(friend instanceof Object);  //true
console.log(friend instanceof Original2);  //true
console.log(friend.constructor == Original2);  //false
console.log(friend.constructor == Object);  //true

Original2.prototype.sayHi = function(){
    console.log("hi");
};
friend.sayHi();   //"hi" ?works!

//实例中的指针仅指向原型,不指向构造函数,即重写的原型对象
function Student(){
}
var friend = new Student();
Student.prototype = {
    constructor: Student,
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",
    sayName : function () {
        alert(this.name);
    }
};
// friend.sayName();   //error

console.log("------------------------------------------eg");
console.log(typeof Array.prototype.sort);         //"function"
console.log(typeof String.prototype.substring);   //"function"

//通过原型模式给String 对象定义新的方法
String.prototype.startsWith = function (text) {
    return this.indexOf(text) == 0;
};
var msg = "Hello world!";
console.log(msg.startsWith("Hello"));   //true

//原型对象的问题
console.log("------------------------------------------原型对象的问题");
function Tea(){
}
Tea.prototype = {
    constructor: Tea,
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",
    friends : ["Shelby", "Court"],
    sayName : function () {
        console.log(this.name);
    }
};

var tea1 = new Tea();
var tea2 = new Tea();
tea1.friends.push("Van");

console.log(tea1.friends);    //"Shelby,Court,Van"
console.log(tea2.friends);    //"Shelby,Court,Van"
console.log(tea1.friends === tea2.friends);  //true

4.组合使用原型模式和构造函数模式 (常见的方式)

//组合使用原型模式和构造函数模式
function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ["Tom","Lily"];
}
Person.prototype = {
    constructor : Person,
    sayName:function () {
        console.log(this.name);
    }
}
var p1 = new Person("zz",21,'teacher');
var p2 = new Person("cc",21,'student');

p1.friends.push("Lucy");

console.log(p1.friends);
p1.sayName();
console.log(p2.friends);
p2.sayName();

5.动态原型模式

//动态原型模式
function Person(name, age, job){
    //properties
    this.name = name;
    this.age = age;
    this.job = job

    //methods
    if (typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            console.log(this.name);
        };
    }
}

var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName()

6.寄生构造函数

//寄生构造函数,与工厂模式语法相同,在不改变原有的引用类型下返回新的值
function specArray() {
    var newArr = new Array();
    //赋值
    newArr.push.apply(newArr,arguments);
    newArr.toSpecString = function () {
        return this.join("|");
    }
    return newArr;
}

var arr = new specArray("Gelei","Nazi")
var specArr = arr.toSpecString();
console.log(specArr); //Gelei|Nazi

7.稳妥构造函数模式

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

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,093评论 0 6
  • 本章内容 理解对象属性 理解并创建对象 理解继承 面向对象语言有一个标志,那就是它们都有类的概念,而通过类可以创建...
    闷油瓶小张阅读 841评论 0 1
  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,401评论 3 12
  • 普通创建对象和字面量创建对象不足之处:虽然 Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有...
    believedream阅读 2,356评论 2 18
  • 很小的时候,特别热衷与那种会飞的气球,因为在我稚嫩的眼中,它们是透明的,自由的。 但因为家比较穷,一直没钱买。于是...
    幽谷逸林阅读 388评论 0 1