面试题-沉香救母-对象篇

从前有个书生叫刘彦昌(也有叫刘向),上京赶考时,顺道登华山一游。华山上有一座神庙,庙神三圣母(也叫华岳三娘) 是玉帝的外甥女,二郎神的妹妹。她美丽善良多情,自从被王母派遣到华山后,一直过着孤独寂寞的生活。这天,她正在庙中吟歌漫舞,消磨时光,突然发现一个书生跨进了庙门。她急忙登上莲花宝座,化为一尊塑像。走进大殿的刘向,一眼就看到了三娘的塑像俊丽、温柔、安闲,刘向被深深吸引住了,心想要是能娶她做妻子该多幸福啊!可惜这只是一尊没有情感知觉的雕像。刘向怀着深深的遗憾,抑制不住内心的激动,取出笔墨,深情地在墙上抒写了自己对三娘的爱慕之情。

三娘默默地看着这一切,心中不禁百感交集。面前这个书生多么英俊倜傥,文采斐然,他对自己满怀深情,而自己又何尝不被他深深吸引,又何尝不爱恋他呢?可是,一个是上界仙女,一个是下方凡人,又哪能缔结姻缘呢?目送怅怅离去又依依不舍的刘向,三娘再也不能平静了。她沉吟再三,终于决定不顾天条禁令,要与刘向结为夫妻。于是,三娘便化为一民间女子,追上刘向,向他道出了真情,从此后二人两情依依,结为伉俪,恩爱无比。刘向考期将临,三娘已有孕在身,依依惜别之时,刘向赠给三娘一块祖传沉香,说日后生子可以"沉香"为名。二人十八里相送,难舍难分。

刘向在京城一举中榜,被任命为扬州府巡按。就在他走马上任之时,华岳三娘却遭难了。原来,这时正值王母娘娘生日,在天宫大办蟠桃会,各路神仙均来赴会祝寿,可是三娘有孕在身,便推脱染病而留在华山。谁知,真情被三娘的哥哥二郎神知道了,二郎神勃然大怒,责怪妹妹私嫁凡人,触犯天条律令,要捉她上天受惩罚。三娘一身正气,毫不畏惧,况且她随身还有一件王母赠的宝物-宝莲灯,此物是三娘的镇山之宝,无论哪路妖魔,哪方神仙,只要宝莲灯大放异彩,都会被震慑称服,束手就擒的。二郎神自知不敌,就令自己的天犬乘三娘休息之际,将宝莲灯偷盗而去。这样,可怜的三娘就被二郎神压在华山下的黑云洞中。三娘在暗无天日的洞中生下了儿子沉香,为防不测,她偷偷恳求夜叉,将儿子送到扬州,留在其父刘向身边。

沉香长大后,渐渐懂事了,知道了母亲被压在华山下受苦,就一心想救出母亲三娘。他把想法对父亲说了,无奈刘向也只是一介文弱书生,只有叹气摇头。于是沉香便独自离家,去找母亲。他吃尽了千辛万苦,终于走到了华山。可是母亲在哪里呢?这个只有八岁的孩子,不知所措,放声大哭起来。凄厉痛苦的哭喊声,在空谷回荡,惊动了路过此地的霹雳大仙。好心的大仙,问明情由,深为善良的三娘和苦命的孩子鸣不平,可是却也无可奈何。于是他将沉香带回自己的洞府。沉香在大仙的指点下,刻苦认真的学习本领,渐渐学会了百般武艺。十六岁生日那天,沉香向师父辞行,要去华山救母。大仙念他人小有志气,赠给他一柄萱花开山神斧。

沉香腾云驾雾,来到华山黑云洞前。他大声呼唤娘亲,声音穿透重重岩层,传入三娘耳中。三娘不由心情激荡,百感在心。她知儿子已长大成人,一片孝心来救自己,激动不已,就将沉香唤到洞前。三娘自知哥哥二郎神神通广大,当年大闹天宫的孙悟空也败在他手中;沉香又年幼,况且二郎神还盗去了宝莲灯,儿子哪能是他对手呢?所以,三娘叫沉香去向舅舅求情。

沉香飞身来到二郎庙,向二郎神苦苦哀求。谁知二郎神铁石心肠,不但不肯放出三娘,反而舞起三尖两刃刀,叫嚣道:

"你若打赢我,我便放了你母亲。"

尖刃处芒光一闪,下一刻,刀尖便飞至沉香额头处,沉香身型一沉,抡起神斧,挡下了这一击,斧口在晃动,连带沉香后退了几步。

仅凭力量就能占据上风,这,就是二郎神-杨戬。

沉香思考片刻,决定主动出击,看招。

"js中的对象最主要的就属性,而属性分两类,一为自有属性,二为继承属性。

而我们可以通过两个东西去看待对象,一为构造器,二为原型对象(后面简称原型)。

构造器中会定义对象的属性,比如变量、方法等,作为自由属性。

而对象会将其原型上的属性继承过来,作为继承属性"

js 复制代码
class father{
    // 构造器,里面定义了自有属性
    constructor(name){
        this.name = name
    }
}
// 通过prototype可以访问原型,并设置原型
// fater会继承原型的变量sex
father.prototype.sex = 'man'

沉香飞至杨戬身前,不断挥舞起神斧,均裂之势骤然迸发。

杨戬不屑的歪了下嘴角,手中的三尖两刃刀如臂指使,他,也开始挥舞起来。

"dang",每挥一次,刀尖都能精准的击退神斧,而且游刃有余。

这便是二郎神的'技'。

"哼" 沉香再次发力

js创建一个对象有三种方法,且无论如何都围绕着构造器和原型来创建

  1. 第一种:字面量创建

    js 复制代码
    let obj = {name:'1'}

    这种创建方式默认调用了js内置的Object,而这个Object是一个构造函数,诸位可以按下面去理解

    js 复制代码
    function Object(name){
        this.name = name
    }
    • 字面量创建的所有对象的原型都是Object这个构造函数的原型

    • js里的函数都是对象,所以Object也有原型,我们可以通过Object.prototype来访问Object的原型

    • 这个原型有很多对象的属性,比如toString、valueOf等

    • 而这个原型是js内置的,也是一个对象,所以它也有原型,而这个原型是null,面试题之一

    • 原型链的尽头是null

    • 访问一个对象的原型最正统的方式是Object.getProtoTypeOf(obj)

斧子的刃处泛起了紫光,沉重一挥,犀利的紫光脱离斧刃,形成紫色光刃,向杨戬飞去。

杨戬身型闪烁,光刃飞出天际,无伤。

  1. 第二种:new关键字创建对象

    js 复制代码
      let obj = new Object({name:'1'})
    • new后要跟着一个构造函数,而Object便是内置的构造函数

    • Object接受参数,构造出自有属性

    • 通过new创建的对象的原型即构造函数的原型

第二道光刃离斧即闪,宛若凭空出现自杨戬目前。

三尖两刃刀轻轻一挑,光刃即刻消散,仿佛未曾不存在一般。

"就这?"

  1. 第三种:Object.create()

    js 复制代码
      let obj = Object.create({name:'1'})
    • Object.create()接受一个对象,其作为创建出来的对象的原型。

    • 即obj的原型是{name:'1'},而不是Object这个构造函数的原型

    • 而obj本身没有自有属性

金光沾满了整个斧子,沉香沉斧蓄力,斧刃处的金光随着时间越来越亮眼芒,待光芒到达临界值,沉香一挥,满斧金光倾斜而出,光刃占满半边天空,所过之处,空间隐隐波动。

"有点东西"

二郎神虚空一握,光刃中心凭空出现一只紫金色的手,硬生生捏爆了光刃。 漫天的金光衬托出二郎神的强大。

沉香加快了呼吸,尽管神斧在手,但这三次攻击着实消耗了不少神力。

"小子,吃我一招"

二郎神身型一闪,瞬息而至,伴随而来的还有无坚不摧的三尖两刃刀。

沉香举起斧头一挡,碰撞处,一阵能量破发,沉香被震飞,直撞一座山头,深陷其中,内脏翻涌,一口鲜血夺口而出。

"咳..."

"咳..."

"咳..."

沉香闭上了双眼

对象的每个属性都有一个用来描述该属性的对象,又称属性描述

js 复制代码
let obj = {name:'1'}

通过Object.getOwnPropertyDescriptor(obj,'name')可以访问obj中name的属性描述符

js 复制代码
{
  configurable: true,
  enumerable: true,
  value: "1",
  writable: true,
}

二郎神没有给他喘息的机会,携着三尖两刃刀再次突脸,直接刺了过去。

当刀尖和斧刃接触的瞬间。

writable为true时,这个属性obj.name可以修改,false则不可修改

神斧发出了鲜红的光芒,带着沉香旋转了起来,一声龙吼,二郎神被震开了,虎口竟生疼。

"嗯?有点东西,再来"

二郎神当头一劈

value即这个属性obj.name的值

"dang"

沉香再次旋转起来,又一声龙吼,二郎神被震的更远了,整条手臂竟然颤抖起来了

二郎神多少有点不悦了,

三尖两刃刀发出了神器该有的神光,一击蓄力上挑,

对象的属性有一些可枚举,另一些不可枚举,Object.keys(obj)方法就是为了获取obj中所有的可枚举的属性,包括 for (const key in object)遍历方式也是获取可枚举的属性。

而决定对象的属性是否可以枚举取决于属性描述器里的enumerable是否为true

即便enumerable:false,我们依旧能访问该属性obj.name

"dang"

神斧的鲜红越来深邃,仿佛要滴出来一般,仿佛在和三尖两刃刀回击道:谁还不是个神器了。

沉香旋转起来,一声传神的龙吼,杨戬被震飞了,虎口竟出血了。

身为天庭的武强之仙,竟被一个小辈给伤到,杨戬恼羞成怒了,

单手高举手中的三尖两刃刀至肩上,与首同高,往后蓄力,法相天地凝聚,神力凝成的千丈长戟裹挟着二郎器的武器,长戟所在的空间承受不住这般力量,开始了坍塌。

长戟瞬息脱手,飞向沉香,仿佛要贯穿了这方天地。

通过Object.defineProperty(),我们可以修改属性的属性描述符

js 复制代码
Object.defineProperty(obj, 'name', { writable: false })

修改了name属性的writable:false,这样就不能修改name的值了

但上面的操作只有当属性描述符的configurable:true才可以,configurable决定属性描述符里的configurable、enumrable、writable是否可以被修改(更细节的得看犀牛书此处)

"dang"

沉香再次旋转起来,一声沉重的龙吼,刀光之间,没能击退长戟。

"dang"

又一声龙吼,依旧没能击退。

就这样,沉香不断旋转,却被长戟不断击退。

"dang"的声响不断,场面声势浩大,惊扰到了四位大仙。

尽管神斧扛得住,但沉香的身体却快撑不住了,握着神斧的两条手臂上血管爆裂,染得一双鲜红修罗手,渗血的眼睛里不知道是愤怒还是救母心切、亦或是拼命。

"叮"

神斧被震飞出去了,砸在了山头,竟是将山体一分为二。

沉香面对着漫天的神光,眼前的长戟在他眼里无限放大,戟尖上的光芒仿佛要贯穿它的肉体和精神。

似乎没能贯穿他拯救母亲的渴望,他双手握住戟尖,光是刮起的风就能切割他的皮肤,带出丝丝鲜血。

双手处更是血肉模糊,但沉香依旧坚持着,他必须打败二郎神,救出母亲。

眼看戟尖离额头越来越近,沉香就越发绝望。

戟尖刺破了额头的皮肤,下一刻便会贯穿他的头颅。

他闭上了眼睛,而一道彩光率先射入了沉香的额头

对象的属性分为两类

  1. 一类是数据属性,它的属性描述符为{writable:true,enumrable:true,configurable:true,value:值}

    js 复制代码
    let obj = {name:1}
    js 复制代码
    let obj = {name:{writable:true,enumrable:true,configurable:true,value:1}}
    js 复制代码
    let obj = {}
    Object.definedProperty(obj,'name',{writable:true,enumrable:true,configurable:true,value:1})

    上面这三种方式创建的属性都是数据属性

  2. 另一类是存取器属性,他的属性描述符为

    js 复制代码
    {
        get:function(){},
        set:function(){},
        enumerable:true,
        configurable:true
    }
    js 复制代码
    let obj = {
      name:{
        get:function(){
          return 1
        },
        set:function(name){
            this.name = name + '1'
        },
        enumerable:true,
        configurable:true
      }
    }

    当访问obj.name时,便会触发get,并将函数的返回值作为属性的值

    当设置obi.name时,便会触发set,并将函数的返回值作为属性的值

    而这个set和get就是vue框架数据响应式实现的根基

戟尖没再能深入半分,一只神光凝聚的大手牢牢地握住了千丈长的长戟的戟柄。

此刻,一个千丈高的法相天地挡在了沉香的前面,而这法相天地的模样竟和沉香有着七分相似。

"喝"

神斧应声遁出,在空中化为点点神光,汇聚在法相天地身前,凝聚成了千丈大的巨斧。

法相天地挥舞起神斧,展现出了战天斗地的意志,一条龙型神波,直奔杨戬。

神龙的身型在二郎神眼中不断放大,二郎神的法相天地直接一声咆哮,手中的长戟化身成了一条神犬,直冲神龙。

在两者相碰的瞬间,天地寂灭,时间仿佛在此刻停顿了下来。

...

...

...

下一刻,无尽的白光喷射而出,一道身影斜飞下底面,在地下轰出一个百丈的巨坑。

此人竟是二郎神-杨戬。

之前飞入沉香额头的神光是四仙姑所为,四仙姑实在不忍二郎神如此欺负一个后辈。

有了这股力量,沉香自己就能劈开华山,法相天地一斧子把华山劈开了,救出了母亲。整整十六年,受尽了苦难的三娘才重见天日,她与儿子紧紧抱在一起,百感交集,泪流满面。

相关推荐
觉醒法师4 分钟前
HarmonyOS开发 - 电商App实例二( 网络请求http)
前端·http·华为·typescript·harmonyos·ark-ts
沈剑心4 分钟前
Kotlin的协程,真能提升编程效率么?
android·前端·kotlin
堕落年代14 分钟前
Vue主流的状态保存框架对比
前端·javascript·vue.js
没资格抱怨16 分钟前
el-pagination的使用说明
javascript·vue.js·elementui
OpenTiny社区25 分钟前
TinyVue的DatePicker 组件支持日期面板单独使用啦!
前端·vue.js
冴羽25 分钟前
Svelte 最新中文文档教程(22)—— Svelte 5 迁移指南
前端·javascript·svelte
树上有只程序猿29 分钟前
Vue3组件通信:多个实战场景,轻松玩转复杂数据流!
前端·vue.js
青红光硫化黑35 分钟前
React基础之useEffect
javascript·react.js·ecmascript
剪刀石头布啊37 分钟前
css属性值计算过程
前端·css
bin915342 分钟前
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14基础固定表头示例
前端·javascript·vue.js·ecmascript·deepseek